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());
我尝试使用不同的编码(UTF-8,UTF-16,ASCII),但后来它变得更糟;我开始得到问号符号和汉字(是的,有点霰弹枪的方法,但我只是在试验).
我读过这篇文章:http://www.joelonsoftware.com/articles/Unicode.html
……但它并没有真正解释为什么我看到我所看到的东西,除非在C#中,读者在遇到像这样奇怪的字符时开始切断位.在此先感谢您的帮助!
解决方法
我们首先要说的是,普通用户制作的文件无法使用UTF-8.并非Windows中的所有程序都支持它(excel,notepad ..),更不用说将它作为默认编码(即使大多数开发人员工具也不默认为utf-8,这让我感到疯狂).由于很多开发人员都不明白编码这样的东西是否存在,那么普通用户在utf-8恶意环境中保存文件的可能性有多大?
这是你的问题首先出现的地方.根据documentation,您正在使用File.ReadAllText(filePath);只能检测UTF-8或UTF-32.
实际上,只需读取Windows-1252中正常编码的文件,其中包含“a”和“产生字符串”a a“,其中 是unicode replacement character(阅读维基百科部分,它描述了您所处的情况!)用于替换无效字节.当替换字符再次编码为UTF-8并解释为Windows-1252时,您将看到�,因为UTF-8中的bytes字节是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
因为您看到了�,您正在查看新制作的文件的工具也使用Windows-1252.因此,如果目标是让文件在该工具中显示正确的字符,则必须将输出编码为Windows-1252:
Encoding windows1252 = Encoding.GetEncoding("Windows-1252"); File.WriteAllText(@"C:\myFile",sb.toString(),windows1252);