我有一个包含阿拉伯语和英语单词/字母/数字的文件。我正在尝试使用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代码做出哪些更改,以便它会读取文件并打印出来吗?
答案 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(网络字节顺序)。
FF
FE
表示UTF-16,little-endian。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)。