重写文本时未保留非英文字符

Bin*_*ier 4 .net c# file-io text character-encoding

我在客户网站上遇到了一个问题,其中包含"HabitaþÒo"字样的行会在输出中受到损坏.我正在处理一个文本文件(拉出选定的行并将它们写入另一个文件)

为了诊断,我把问题归结为一个只有那个坏词的文件.

原始文件不包含BOM,但.net选择将其读作UTF-8.

读取和写入时,这个词最终看起来像"Habita o".

BadWord.txt文件的十六进制转储如下所示

在此输入图像描述

使用此代码复制文件

using (var reader = new StreamReader(@"C:\BadWord.txt"))
using (var writer = new StreamWriter(@"C:\BadWordReadAndWritten.txt"))
    writer.WriteLine(reader.ReadLine());
Run Code Online (Sandbox Code Playgroud)

...给...

在此输入图像描述

保留读者编码也没有做任何事情

using (var reader = new StreamReader(@"C:\BadWord.txt"))
using (var writer = new StreamWriter(@"C:\BadWordReadAndWritten_PreseveEncoding.txt", false, reader.CurrentEncoding))
    writer.WriteLine(reader.ReadLine());
Run Code Online (Sandbox Code Playgroud)

...给... 在此输入图像描述

任何想法在这里发生了什么,我如何处理这个文件并保留原始文本?

Esa*_*ija 8

唯一的方法是以相同的编码读取文件,它已被编码.这意味着Windows-1252:

Encoding enc = Encoding.GetEncoding(1252);
string correctText = File.ReadAllText(@"C:\BadWord.txt", enc);
Run Code Online (Sandbox Code Playgroud)

  • @balexandre不,它不是,它与文件编码无关,不可移植,而且总是一个bug.如果我将我的Windows语言环境设置为阿拉伯语,它将完全随机,这意味着代码将尝试将文件解码为Windows-1256,但文件*必须*解码为Windows-1252.这绝对没有意义. (3认同)