2015-05-20 41 views
0

我有一個包含阿拉伯文和英文單詞/字母/數字的文件。我正在嘗試使用Here中的代碼來打印文件。當我用記事本打開文件時,我看到所有有趣和不可打印的字符。當我保存相同的文件爲統一碼另存爲...文件菜單(記事本),並選擇Unicode,文件顯示正確(我看到阿拉伯文字母等)。閱讀包含阿拉伯文的文件

當我在notepad++打開相同的文件正確顯示的文件是唯一的選擇

菜單 - > Encoding->字符SET->阿拉伯語

在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

GetEncoding(1252)不能正確。嘗試1256,864,720。或者發回文件,你不需要它。 –

+0

@HansPassant謝謝。我會試一試並回報 – Zuzlx

+0

@HansPassant 1256(不是1252)是解決方案。如果你提供了答案,那將是「接受答案」。再次感謝。 – Zuzlx

回答

4
var arabic = Encoding.GetEncoding(1252); 

不是這樣,1252是西歐和美洲的Windows代碼頁。您的下一個猜測是1256,阿拉伯語的默認Windows代碼頁。你的下一個猜測應該是傳統的MS-DOS代碼頁,864和720.

這種痛苦應該激勵你聯繫創建該文件的公司或程序員。現在是他們更新的時候了。你可以給他們最好的參數是你現在可以使用,可能不會在他們需要更新。

1

您需要查看BOM(字節順序標記,U+FEFF),它應該是文件中的第一個Unicode字符。如果沒有找到它,它可以是簡單的ASCI,沒有字節順序標記或奇怪的UTF-8。

讀取文件的前幾個八位字節。的BOM被編碼爲不同的不同編碼:

  • FE六角BBBF表示UTF-8。但是,對於UTF-8,BOM是可選的,沒有意義,UTF-8是8位編碼等。如果找不到,則不能保證該文件是UTF-8。它可以是純ASCII或使用其他一些非Unicode DBCS方案進行編碼。

  • 十六進制FEFF表示UTF-16,big-endian(網絡字節順序)。

  • 十六進制FFFE表示UTF-16,小端。
  • 十六進制0000FEFF指示UTF-32,big-endian(網絡字節順序)。
  • 十六進制FFFE0000表示UTF-32,小尾數。

  • 等請參閱http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding瞭解更多。

您可能會注意到這不是簡單的。一個小端,UTF-16編碼文件將很難區分小端,UTF-32編碼文件... 如果它是第一個非BOM的Unicode字符是一個ascii NUL(U + 0000)。

+0

謝謝。它有很多很好的信息。我會過去的。在「應該指出文件的編碼如下:'還是那個冒號意味着一段時間? – Zuzlx