读取包含阿拉伯语的文件
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。
这种痛苦应该会促使您联系创建该文件的公司或程序员。现在是他们更新的时候了。你可以给他们的最好的论据是你现在有空,可能不会在他们需要更新时出现。
我有一个包含阿拉伯语和英语的文件 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。
这种痛苦应该会促使您联系创建该文件的公司或程序员。现在是他们更新的时候了。你可以给他们的最好的论据是你现在有空,可能不会在他们需要更新时出现。