BrD*_*aHa 6 c# unicode stringbuilder encoding ascii
我正在编写一个程序,将文件中的所有文本读入字符串,循环查看字符串,然后使用Stringbuilder将字符追加到另一个字符串.我遇到的问题是当它被写回来时,特殊字符如“
和”
,看起来像是�
字符.我不需要进行转换,我只是希望它以我读取它的方式写回来:
StringBuilder sb = new StringBuilder();
string text = File.ReadAllText(filePath);
for (int i = 0; i < text.Length; ++i) {
if (text[i] != '{') { // looking for opening curly brace
sb.Append(text[i]);
continue;
}
// Do stuff
}
File.WriteAllText(destinationFile, sb.ToString());
Run Code Online (Sandbox Code Playgroud)
我尝试使用不同的编码(UTF-8,UTF-16,ASCII),但后来它变得更糟; 我开始得到问号符号和汉字(是的,有点霰弹枪的方法,但我只是在试验).我读过这篇文章:http://www.joelonsoftware.com/articles/Unicode.html ...但它并没有真正解释为什么我看到我所看到的,除非在C#中,读者开始切断位它击中了那样奇怪的角色.在此先感谢您的帮助!
Esa*_*ija 11
TL; DR绝对不是UTF-8,你甚至不使用UTF-8来读取生成的文件.读为Windows1252,写为Windows1252(如果您要使用相同的查看方法查看生成的文件)
我们首先要说的是,普通用户制作的文件无法使用UTF-8.并非Windows中的所有程序都支持它(excel,notepad ..),更不用说将它作为默认编码(即使大多数开发人员工具也不默认为utf-8,这让我感到疯狂).由于很多开发人员都不明白编码这样的东西是否存在,那么普通用户在utf-8恶意环境中保存文件的可能性有多大?
这是你的问题首先出现的地方.根据文档,您使用的重载File.ReadAllText(filePath);
只能检测UTF-8或UTF-32.
实际上,只需读取在Windows-1252中正常编码的文件,其中包含"a”a"
字符串中的结果"a?a"
,其中?
是unicode替换字符(读取维基百科部分,它描述了您所处的情况!)用于替换无效字节.当替换字符再次编码为UTF-8并解释为Windows-1252时,您将看到,�
因为?
UTF-8 0xEF, 0xBF, 0xBD
中的字节是�
Windows-1252 中的字节.
所以把它读作Windows-1252,你就在那里:
Encoding windows1252 = Encoding.GetEncoding("Windows-1252");
String result = File.ReadAllText(@"C:\myfile.txt", windows1252);
Console.WriteLine(result); //Correctly prints "a”a" now
Run Code Online (Sandbox Code Playgroud)
因为您看到�
,您正在查看新制作的文件的工具也使用Windows-1252.因此,如果目标是让文件在该工具中显示正确的字符,则必须将输出编码为Windows-1252:
Encoding windows1252 = Encoding.GetEncoding("Windows-1252");
File.WriteAllText(@"C:\myFile", sb.toString(), windows1252);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1427 次 |
最近记录: |