我有一个StringBuilder
,我想写一个包含重音的文本到csv文件。
代码:
StringBuilder strbr = new StringBuilder();
strbr.AppendLine("ù;é;à");
File.WriteAllText(filePath + ".csv", strbr.ToString());
但是当我打开我的csv文件时,只有:é
文件" test.csv'正确包含ù;é;à
,但当我用Excel打开它时,我有:
也许我错过了Excel的标题?
答案 0 :(得分:5)
该文件将使用 UTF-8 编码保存,但使用默认值进行读取,例如Win-1251。您可以显式指定编码(在这种情况下为UTF8
):
File.WriteAllText(filePath + ".csv", strbr.ToString(), Encoding.UTF8);
编辑:对于我最初的误导性解释,我感到非常抱歉(感谢Patrick Hofman指出了这一点)。实际问题是缺少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,因此尝试使用默认编码读取文件。
答案 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中打开它们分别给出:
来自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);