2016-03-02 77 views
1

我有一個包含字母ø的文件。當我用這個代碼File.ReadLines(filePath)從它讀取時,我得到了一個問號而不是它。閱讀文件時的C#編碼

當我添加像這樣的編碼File.ReadLines(filePath, Encoding.GetEncoding(1252))我得到ø字符。

但默認編碼已被設置爲1252,財產Encoding.Default.CodePage返回1252

那麼,爲什麼我必須指定編碼爲1252一邊讀書,當默認一個已被設置爲1252

還有一個問題,如果文件是Unicode,C#會識別它的格式,或者我必須指定Unicode編碼?

+1

File.ReadLines默認使用utf8進行編碼 –

+1

使用傳統的8位代碼頁編碼(如1252)是上個世紀的做法。你只需要停止這樣做,今天沒有剩下的理由不使用utf-8。正如你發現的那樣,File.ReadLines()默認爲Encoding.UTF8。刪除文件或使用文本編輯器重新保存文件。記事本已經足夠好了,在SaveAs對話框上編碼組合框。 –

+0

寫入文件時是否也使用UTF-8默認值? – Aleksa

回答

2

原因是默認情況下,讀取文本文件時使用的編碼是UTF8。

Encoding.Default不是(儘管它的名字)在讀取文件時使用的默認編碼!

在我看來,Encoding.Default更好的名字應該是Encoding.UsingCurrentCodePage。 ;)

另請注意,與其使用File.ReadLines(filePath, Encoding.GetEncoding(1252)),您可以使用File.ReadLines(filePath, Encoding.Default)

如果您的代碼嘗試讀取已在不同於1252的代碼頁中創建的文件,並且該代碼頁是運行代碼的系統的當前代碼頁,那麼您應該這樣做。

您應該使用代碼頁的唯一原因是您正在讀取或寫入傳統文件。

+0

寫入文件時,UTF-8也是默認的嗎? – Aleksa

+1

@Aleksa是的。這是現今檔案的標準。 –

+0

經過大量測試後,我發現下面的代碼更好用,而不是「Encoding.Default」 var csvContent = System.IO.File.ReadAllText(import.File.LocalPath,Encoding.GetEncoding(「Windows-1252」)); – Ali