阅读包含阿拉伯语的文件

时间:2015-05-20 23:42:11

标签: c# file encoding printing character-encoding

我有一个包含阿拉伯语和英语单词/字母/数字的文件。我正在尝试使用Here中的代码打印文件。当我在记事本中打开文件时,我会看到所有有趣且无法打印的字符。当我在另存为... 文件菜单(记事本)中保存与 Unicode 相同的文件并选择Unicode时,文件显示正确(我看到阿拉伯字母等) )。

当我在notepad++中打开同一个文件时,唯一正确显示文件的选项是

菜单 - >编码 - >字符集 - >阿拉伯语

使用C#,我试图逐行读取文件并使用

打印
ev.Graphics.DrawString(line, printFont, Brushes.Red, leftMargin, yPos, _sf);

其中line是文件中的行。当文件以正确的编码保存时,一切都打印得很好。但是当我们遇到编码问题时,我们会收到一堆钻石,问号等等。

以下是我尝试使用正确编码打开文件的几种方法(来自不同来源)(请让我知道其中一个应该有效,我会再试一次):

尝试1

var arabic = Encoding.GetEncoding(1252);
var bytes = arabic.GetBytes(line);
line = arabic.GetString(bytes);`

尝试2

streamToPrint = new StreamReader(this.filepath,System.Text.Encoding.UTF8,true);

尝试3

byte[] utf8Bytes = Encoding.UTF8.GetBytes(line);
line = Encoding.Unicode.GetString(utf8Bytes);`

它们都不起作用。有人可以告诉我我必须对Here代码做出哪些更改,以便它会读取文件并打印出来吗?

2 个答案:

答案 0 :(得分:4)

   var arabic = Encoding.GetEncoding(1252);

不是这样,1252是西欧和美洲的Windows代码页。您的下一个猜测是1256,这是阿拉伯语的默认Windows代码页。您的下一个猜测应该是传统的MS-Dos代码页,864和720。

这种痛苦应该激励您联系创建该文件的公司或程序员。现在是他们更新的时候了。您可以给予他们的最佳参数是您现在可以使用,可能无论何时需要更新。

答案 1 :(得分:1)

您需要查看BOM(字节顺序标记,U+FEFF),它应该是文件中的第一个Unicode字符。如果没有找到它,它可以是普通的ASCI,UTF-8没有字节顺序标记或奇怪的东西。

读取文件的前几个八位字节。对不同的编码,BOM的编码方式不同:

  • hex FE BB BF表示UTF-8。但是,对于UTF-8,BOM是可选的,它没有意义,UTF-8是8位编码的全部。如果没有找到,则无法保证文件是UTF-8。它可以是纯ASCII或使用其他非Unicode DBCS方案编码。

  • hex FE FF表示UTF-16,big-endian(网络字节顺序)。

  • hex FF FE表示UTF-16,little-endian。
  • hex 00 00 FE FF表示UTF-32,big-endian(网络字节顺序)。
  • hex FF FE 00 00表示UTF-32,小端。

  • 等。有关详情,请参阅http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding

你可能会注意到这不是万无一失的。一个小端,UTF-16编码文件很难区别于小端UTF-32编码文件... 如果它的第一个非BOM Unicode字符是ascii {{1 (U + 0000)。