StringBuilder和重音

时间:2018-04-20 12:55:22

标签: c# encoding stringbuilder

我有一个StringBuilder,我想写一个包含重音的文本到csv文件。

代码:

StringBuilder strbr = new StringBuilder();
strbr.AppendLine("ù;é;à");
File.WriteAllText(filePath + ".csv", strbr.ToString());

但是当我打开我的csv文件时,只有:é

文件" test.csv'正确包含ù;é;à,但当我用Excel打开它时,我有:

Excel screenshot

也许我错过了Excel的标题?

3 个答案:

答案 0 :(得分:5)

该文件将使用 UTF-8 编码保存,但使用默认值进行读取,例如Win-1251。您可以显式指定编码(在这种情况下为UTF8):

File.WriteAllText(filePath + ".csv", strbr.ToString(), Encoding.UTF8);

编辑:对于我最初的误导性解释,我感到非常抱歉(感谢Patrick Hofman指出了这一点)。实际问题是缺少BOM Bite Order Mark):默认情况下File.WriteAllTextUTF8格式写入文本而不用 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,因此尝试使用默认编码读取文件。

答案 1 :(得分:4)

如果在开头没有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中打开它们分别给出:

enter image description here

enter image description here

来自Dmitry Bychenko's answer的代码似乎正确地发出了BOM。

答案 2 :(得分:1)

您可以指定编码:

Optional<Animal> catToAnimal(Cat cat) {
    return Optional.empty();
}

Function<Cat, Optional<Animal>> function2b = this::catToAnimal;
List<Animal> animalList2b = transform(catList, function2b);