【问题标题】:Unicode in CSV file?CSV文件中的Unicode?
【发布时间】:2010-09-16 15:39:11
【问题描述】:

我需要生成一个 CSV 文件。也许我“做错了”,因为我用我自己的代码而不是使用 lib 转储文件,但无论如何。

看起来我一切正常。引号,逗号和一切似乎都完美地逃脱了。这很容易。问题是我正在使用 unicode 字符串进行测试,它们以 ???? 的形式出现。当我使用 MS Excel 用我的测试字符串保存文件并点击另存为 CSV 打开文件时,我遇到了同样的问题(unicode 字母变成 ?????)。不支持unicode吗?

我只是尝试像这样转储字符串而不是将其输出到网页

var f = new System.IO.StreamWriter(filename, false, System.Text.Encoding.Unicode);

现在我看到了 unicode 文本,但现在所有内容都在一列中。奇怪的是,在我选择的文本编辑器中,一切看起来都很正常,如果我复制/粘贴几列并将其粘贴为另存为 .csv,我会看到这些列正常。虽然它可能会去除 unicode。

如何正确保存?

【问题讨论】:

  • 使文本的编码与网页的编码相匹配。
  • 把你的代码的 sn-p 用于编译 CSV。

标签: .net unicode csv


【解决方案1】:

System.Text.Encoding.Unicode 使用 UTF-16 编码。尝试告诉您的文本编辑器使用 UTF-16 进行解码;我猜您用来显示输出文件的编辑器默认为 UTF-8 或 ASCII。如果是这样,另一种方法可能是使用System.Text.Encoding.UTF8 对输出进行编码。

【讨论】:

  • 我很惊讶。我按照您的建议使用了 UTF8,并且这些列作为列而不是一个大列出现。公认!这还是很奇怪的。但我很高兴
  • 这只是意味着您使用的文本编辑器不支持 UTF-16。在 UTF-8 中,ASCII-7 / 拉丁字符是一个字节,就像 ASCII 一样。除非您超出 ASCII-7 范围,否则 UTF-8 中的内容不会变成多字节。在 UTF-16 中,所有内容都至少有两个字节长,因此 ASCII-7 / 拉丁字符看起来就像每个 char 字节之间有一个空字节。不支持 UTF-16 的文本阅读器很容易陷入您所描述的每行显示一个字符的模式。
  • 问题是如何让 CSV 在 excel 中工作,而这正是我的答案。 excel做错什么都没关系。如果它不起作用,那么它不是我问题的解决方案。
  • 危险在于,如果切换到 UTF-8 真的只能工作,因为 CSV 阅读器根本不支持 Unicode,并且您当前的数据是 ASCII-7,因此通过 UTF-8 不变,那么问题仍然存在:CSV 阅读器在将来某个时间点出现在数据中时将无法处理“非 ASCII”字符。神奇地消失的东西有神奇地返回的坏习惯。
  • +1 表示“神奇地消失的东西有神奇地返回的坏习惯。” - 简直太棒了!
【解决方案2】:

您需要做两件事:将文本文件(或 html 页面)标记为包含 Unicode 字符(UTF-8 或 UTF-16),并确保您使用的是支持 Unicode 文本的文本编辑器。记事本在 Windows 上是一个不错的选择。

要将文本文件(例如 .csv)标记为包含 Unicode 文本,您需要将 Byte Order Mark (BOM) 作为文本文件中的第一个字符。对于 UTF-16 little-endian (Intel),BOM 将是字节 0xFF、0xFE。字节顺序标记告诉文档阅读器文档中的字符是按大端还是小端排序。 BOM 字符是 Unicode 字符表中保留的非打印字符。此 BOM 还可用于区分 ASCII 文本与 UTF-8 和其他 Unicode 编码(因为 UTF-8 BOM 字节序列不同于 UTF-16 等)。

一些文档编写者会为您编写 BOM,或者可以选择包含或排除 BOM。使用二进制十六进制转储查看文本文件字节以确定您是否有 BOM。不要使用文本编辑器 - BOM 是非显示字符。

要指示您正在生成的 HTML 页面包含 Unicode 字符,您需要设置 Content-Type 标头以指示 Unicode 字符集:例如,Content-Type: text/html; charset=utf-8 指示 UTF-8 编码的 Unicode 文本。

【讨论】:

  • 令人困惑的是,在十六进制编辑器中打开时,我看到了 BOM (FF FE)。我怀疑在以自动编写的 unicode 格式打开时(因为它是一个 streamwriter 并且我指定了编码)。所以除非我应用我可能不会做的 HTML 解决方案,否则答案对我没有帮助。这取决于规格,但 Ani 的回答解决了这个问题,这真的很奇怪。
  • 好的,所以你输出了一个好的 BOM。然后问题出在另一端 - 您的文本编辑器不支持 UTF-16。
  • 文本编辑器只是为了测试行。我首先在实际程序中打开它,microsoft excel。
【解决方案3】:

也可能是 Word 使用的字体缺少您尝试显示的这些字符。如果我打开 Word,按住 ALT 并捣碎我的小键盘,它会将字体更改为数学字体,但仍会显示相关字体中缺少的字符项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-01
    • 2017-06-07
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 2017-06-03
    相关资源
    最近更新 更多