读取包含阿拉伯语的文件

Reading file containing Arabic language

我有一个包含阿拉伯语和英语的文件 word/letters/numbers。我正在尝试使用 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);`

None 其中有效。有人可以告诉我我必须对 Here 代码进行哪些更改才能读取文件并打印出来吗?

需要查看BOM(Byte Order Mark,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,little endian.

  • 等。有关更多信息,请参阅 http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding

您可能会注意到这并非万无一失。小端 UTF-16 编码文件很难与小端 UTF-32 编码文件区分开来...if 它的第一个非 BOM Unicode 字符是 ascii NUL (U+0000).

   var arabic = Encoding.GetEncoding(1252);

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

这种痛苦应该会促使您联系创建该文件的公司或程序员。现在是他们更新的时候了。你可以给他们的最好的论据是你现在有空,可能不会在他们需要更新时出现。