我需要生成一个 CSV 文件。也许我“做错了”,因为我用自己的代码转储文件而不是使用库,但无论如何。
看起来我一切都对。引号、逗号和所有内容似乎都被完美地转义了。这很容易。问题是我正在使用 unicode 字符串进行测试,结果显示为 ????。当我使用 MS Excel 保存带有测试字符串的文件并点击“另存为 CSV”打开文件时,我遇到了同样的问题(unicode 字母变成了??????)。不支持unicode吗?
我只是尝试像这样转储字符串,而不是将其输出到网页
var f = new System.IO.StreamWriter(filename, false, System.Text.Encoding.Unicode);
现在我看到了 unicode 文本,但所有内容现在都在一列中。奇怪的是,在我选择的文本编辑器中,一切看起来都很正常,如果我复制/粘贴几列并将其粘贴到另存为 .csv 中,我会看到这些列很好。虽然它可能会删除 unicode。
如何正确保存它?
System.Text.Encoding.Unicode
使用UTF-16编码。尝试告诉您的文本编辑器使用 UTF-16 进行解码;我猜您用来显示输出文件的编辑器默认为 UTF-8 或 ASCII。如果是这样,另一种方法可能是使用 System.Text.Encoding.UTF8
对输出进行编码。
您需要做两件事:将文本文件(或 html 页面)标记为包含 Unicode 字符(UTF-8 或 UTF-16),并确保您使用的文本编辑器支持 Unicode 文本。 记事本是 Windows 上不错的选择。
要将文本文件(例如 .csv)标记为包含 Unicode 文本,您需要编写 字节顺序标记 (BOM) 作为文本文件中的第一个字符。 对于 UTF-16 小尾数法 (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 文本。
也可能只是 Word 使用的字体缺少您尝试显示的这些字符。如果我打开 Word,按住 ALT 并组合数字键盘,它会将字体更改为数学字体,但仍然显示相关字体中缺少的字符项目。
我也遇到过类似的事情。
当我使用带有 -w 选项的 BCP 来使用 Unicode (UTF-16) 时,
在 Excel 中打开时,每行都显示为单个列。
我找到了这篇文章:在 Excel 中使用 UTF16 编码打开 CSV 文件
他们提到了“制表符”(从未听说过),但我认为他们指的是制表符“”。
对于 BCP,我删除了“-t”参数,因此它默认为“”(制表符)作为分隔符。
“CSV”文件采用制表符分隔,但在 Excel 中打开时会显示正确的列数。
我无法用文档解释它,但它看起来更像是 Excel 中的错误而不是功能。
也许 CSV 标准仅支持 UTF-8 逗号和(无论出于何种原因)
解析器(如 Excel)在解析 UTF-16 中的制表符时错过了该备忘录。