StringBuilder 和重音
StringBuilder and accent
我有一个 StringBuilder
,我想将包含重音的文本写入 csv 文件。
代码:
StringBuilder strbr = new StringBuilder();
strbr.AppendLine("ù;é;à");
File.WriteAllText(filePath + ".csv", strbr.ToString());
但是当我打开我的csv文件时,只有:é
文件“test.csv”正确包含 ù;é;à
,但是当我用 Excel 打开它时,我有:
也许我错过了 Excel 的 header?
文件将使用 UTF-8 编码保存,但使用 默认编码 读取,比如 Win-1251。您可以显式指定编码(在本例中为UTF8
):
File.WriteAllText(filePath + ".csv", strbr.ToString(), Encoding.UTF8);
编辑:非常抱歉我最初的误导性解释(感谢Patrick Hofman who has pointed it out). The actual problem is the absence of BOM (Bite Order Mark):默认情况下File.WriteAllText
将文本写在UTF8
格式 无 BOM:
https://referencesource.microsoft.com/#mscorlib/system/io/file.cs,8a8ede9e1ec4fece
public static void WriteAllLines(String path, IEnumerable<String> contents)
{
// ...
InternalWriteAllLines(new StreamWriter(path, false, StreamWriter.UTF8NoBOM), contents);
}
然后 Excel 读取文件,没有看到任何 BOM,因此尝试使用 默认编码 .
读取文件
您可以指定编码:
File.WriteAllText(filePath + ".csv", strbr.ToString(), Encoding.UTF8);
如果文件开头没有 BOM (0xEF,0xBB,0xBF),Excel 无法正确打开 UTF8 CSV 文件。许多编辑器在这种情况下检测到 UTF8,但 Excel 似乎在这方面做得不好,至少在导入 CSV 文件时是这样。
我创建了一个小的 CSV 文件:
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 C4 85 3B C4 99 3B C4 87 3B C5 BA 3B C5 84 0D 0A ą;ę;ć;ź;ń..
还有第二个:
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 EF BB BF C4 85 3B C4 99 3B C4 87 3B C5 BA 3B C5 ą;Ä™;ć;Ĺş;Ĺ
00000010 84 0D 0A „..
除 BOM 标记外,这些文件完全相同。
在 Excel 中打开它们分别给出:
中的代码似乎可以正确发出 BOM。
我有一个 StringBuilder
,我想将包含重音的文本写入 csv 文件。
代码:
StringBuilder strbr = new StringBuilder();
strbr.AppendLine("ù;é;à");
File.WriteAllText(filePath + ".csv", strbr.ToString());
但是当我打开我的csv文件时,只有:é
文件“test.csv”正确包含 ù;é;à
,但是当我用 Excel 打开它时,我有:
也许我错过了 Excel 的 header?
文件将使用 UTF-8 编码保存,但使用 默认编码 读取,比如 Win-1251。您可以显式指定编码(在本例中为UTF8
):
File.WriteAllText(filePath + ".csv", strbr.ToString(), Encoding.UTF8);
编辑:非常抱歉我最初的误导性解释(感谢Patrick Hofman who has pointed it out). The actual problem is the absence of BOM (Bite Order Mark):默认情况下File.WriteAllText
将文本写在UTF8
格式 无 BOM:
https://referencesource.microsoft.com/#mscorlib/system/io/file.cs,8a8ede9e1ec4fece
public static void WriteAllLines(String path, IEnumerable<String> contents)
{
// ...
InternalWriteAllLines(new StreamWriter(path, false, StreamWriter.UTF8NoBOM), contents);
}
然后 Excel 读取文件,没有看到任何 BOM,因此尝试使用 默认编码 .
读取文件您可以指定编码:
File.WriteAllText(filePath + ".csv", strbr.ToString(), Encoding.UTF8);
Excel 无法正确打开 UTF8 CSV 文件。许多编辑器在这种情况下检测到 UTF8,但 Excel 似乎在这方面做得不好,至少在导入 CSV 文件时是这样。
我创建了一个小的 CSV 文件:
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 C4 85 3B C4 99 3B C4 87 3B C5 BA 3B C5 84 0D 0A ą;ę;ć;ź;ń..
还有第二个:
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 EF BB BF C4 85 3B C4 99 3B C4 87 3B C5 BA 3B C5 ą;Ä™;ć;Ĺş;Ĺ
00000010 84 0D 0A „..
除 BOM 标记外,这些文件完全相同。
在 Excel 中打开它们分别给出: