如何为正在读取的文件设置BOM

时间:2016-08-03 16:30:43

标签: c# encoding utf-8

我一直在阅读包含阿拉伯语和西方语言混合文件的问题。我将文件读入TextBox,如下所示:

tbx1.Text = File.ReadAllText(fileName.Text, Encoding.UTF8);

无论我尝试什么价值而不是" Encoding.UTF8"我用阿拉伯语代替显示乱码。西方文本显示得很好。

我认为这可能是TextBox定义方式的一个问题,但在启动时我会在文本框中写一些混合的西方/阿拉伯语文本,这显示正常:

tbx1.Text = "Start السلا عليكم" + Environment.NewLine + "Here";

然后我打开记事本并将上面的文本复制到其中,然后保存文件,此时记事本保存对话框询问要使用的编码。

enter image description here

然后我将保存的文件显示给我的代码,它正确地显示了所有内容。

我检查了文件并在开头找到了3个二进制字节(在记事本中不可见):

enter image description here

我随后通过研究发现的3个字节代表了BOM,这使得C#" File.ReadAllText(fileName.Text,Encoding.UTF8);"根据需要读取/显示数据。

令我困惑的是指定" Encoding.UTF8"价值应该照顾这个。

我能想到的唯一方法是编写一个步骤,将此数据添加到teh文件的副本,然后处理该文件。但这似乎相当冗长。只是想知道是否有更好的方法,或者为什么Encoding.UTF8没有产生所需的结果。

修改

尽管在答案中尝试了这个建议,但仍然没有运气。

我将测试数据剪切为仅包含阿拉伯语,如下所示:

enter image description here

代码如下:

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 ++中的内容(以及我将要显示的文本框):

enter image description here

不确定问题是从文件读取还是写入文本框。

我会尝试检查读取后的数据。但此刻,我感到困惑。

1 个答案:

答案 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方法   了解更多信息。