我正在打开一个文本文件并删除第一行,以准备使用批量插入在数据库中导入。这是我的代码:
string tempFile = Path.GetTempFileName();
using (var sr = new StreamReader("F:\\Upload\\File.txt", System.Text.Encoding.UTF8))
{
using (var sw = new StreamWriter(tempFile,true, System.Text.Encoding.UTF8))
{
string line;
while ((line = sr.ReadLine()) != null)
{
if (line.Substring(0, 8) != "Nr. Crt.")
sw.WriteLine(line);
}
}
}
System.IO.File.Delete("F:\\Upload\\File.txt");
System.IO.File.Move(tempFile, "F:\\Upload\\File.txt");
在此之后,如果我打开生成的文件,Unicode字符将替换为其他字符。例如,包含非中断空格的字符串(unicode U + 00A0):Value
(注意unicode char)在Value�
中转换。
我该如何避免这种情况?
编辑:
Notepad ++设置为'以UTF-8编码' 以下是它的外观图片:
答案 0 :(得分:6)
转换为Value�
这3个奇数字符的字节值是0xef 0xbd 0xbf。哪个是codepoint \ ufffd的utf8编码,replacement character �。 读取 utf编码文本时使用的内容,文本中包含无效的编码字节序列。
正好指出File.txt的一个问题,它可能没有在utf-8中编码。如果您不知道该文件使用了什么编码,那么第一个猜测就是将Encoding.Default传递给StreamReader构造函数。
答案 1 :(得分:4)
在我看来它写得很好,但你正在阅读的工具并不期望UTF-8。在许多情况下,您需要明确告诉工具期望的编码。但是,常见的方法是预先添加BOM(“字节顺序标记”)。这很简单 - 只需使用new UTF8Encoding(true)
作为编码,它就会自动发生。在不期望BOM的工具中,这将在开始时显示为一些损坏的字符 - 但大多数现代工具将知道其含义,并将自动切换到UTF-8。重点是:UTF-8,UTF-16 LE和UTF-16 BE等的BOM都略有不同,但可识别。更完整的列表位于wikipedia。