我一直在阅读包含阿拉伯语和西方语言混合文件的问题。我将文件读入TextBox,如下所示:
tbx1.Text = File.ReadAllText(fileName.Text, Encoding.UTF8);
无论我尝试什么价值而不是" Encoding.UTF8"我用阿拉伯语代替显示乱码。西方文本显示得很好。
我认为这可能是TextBox定义方式的一个问题,但在启动时我会在文本框中写一些混合的西方/阿拉伯语文本,这显示正常:
tbx1.Text = "Start السلا عليكم" + Environment.NewLine + "Here";
然后我打开记事本并将上面的文本复制到其中,然后保存文件,此时记事本保存对话框询问要使用的编码。
然后我将保存的文件显示给我的代码,它正确地显示了所有内容。
我检查了文件并在开头找到了3个二进制字节(在记事本中不可见):
我随后通过研究发现的3个字节代表了BOM,这使得C#" File.ReadAllText(fileName.Text,Encoding.UTF8);"根据需要读取/显示数据。
令我困惑的是指定" Encoding.UTF8"价值应该照顾这个。
我能想到的唯一方法是编写一个步骤,将此数据添加到teh文件的副本,然后处理该文件。但这似乎相当冗长。只是想知道是否有更好的方法,或者为什么Encoding.UTF8没有产生所需的结果。
修改
尽管在答案中尝试了这个建议,但仍然没有运气。
我将测试数据剪切为仅包含阿拉伯语,如下所示:
代码如下:
FileStream fs = new FileStream(fileName.Text, FileMode.Open);
StreamReader sr = new StreamReader(fs, Encoding.UTF8, false);
tbx1.Text = sr.ReadToEnd();
sr.Close();
fs.Close();
尝试了两个" true"和"假"在第二行,但两者都给出相同的结果。
如果我在Notepad ++中打开文件,并指定阿拉伯语ISO-8859-6字符集,则显示正常。
以下是Notepad ++中的内容(以及我将要显示的文本框):
不确定问题是从文件读取还是写入文本框。
我会尝试检查读取后的数据。但此刻,我感到困惑。
答案 0 :(得分:3)
StreamReader
班级有一个constructor,负责为您测试BOM:
using (var stream = new FileStream(fileName.Text, FileAccess.Read))
{
using (var sr = new StreamReader(stream, Encoding.UTF8, true))
{
var text = sr.ReadToEnd();
}
}
最终的true
参数为 detectEncodingFromByteOrderMark :
detectEncodingFromByteOrderMarks 参数通过查看流的前三个字节来检测编码。它会自动识别:
- UTF-8
- little-endian Unicode
- 和big-endian Unicode文本
如果是文件 以适当的字节顺序标记开始。否则, 使用用户提供的编码。请参阅Encoding.GetPreamble方法 了解更多信息。