2013-03-18 51 views
3

我在設計用於格式化某些文件的程序中調用File.ReadAllText()File.ReadAllText中的字符無效

其中一些文件包含®(174)符號。但是,正在讀取文本時,返回的字符串包含(65533)符號,其中®(174)應該是。

什麼會導致這種情況,我該如何解決它?

回答

11

這很可能是由於Encoding中的不匹配造成的。使用ReadAllText超負荷允許您在閱讀文件時指定正確的Encoding

默認的重載將採用UTF-8,除非它能夠檢測到UTF-32。任何其他編碼都會不正確。

+1

是否有一個原因,該方法不使用Encoding.Default,因爲它的默認編碼? – mrK 2013-03-18 15:59:19

+0

@mrK不知道爲什麼它是這樣,但這是框架設計師選擇使用的。這是記錄,但我同意,一個奇怪的選擇。 – 2013-03-18 16:03:43

+0

一種解釋可能是'Encoding.Default'使用系統中所謂的當前ANSI代碼頁,這個代碼頁因系統而異。使用UTF-8可避免編碼和解碼在具有不同當前ANSI代碼頁的系統上出現的編碼錯誤。而且UTF-8可以編碼所有的UNICODE。 – 2013-03-18 16:53:49

4

您需要在調用File.ReadAllText時指定編碼,除非文件實際上是UTF-8,聽起來好像不是。 (基本上,單參數重載相當於傳入UTF-8作爲第二個參數,它也會用適當的字節順序標記檢測UTF-32,我相信)。

第一件事就是制定出它編碼它(例如ISO-8859-1 - 但你需要檢查這個),然後將其作爲第二個參數傳遞。

例如:

Encoding isoLatin1 = Encoding.GetEncoding(28591); 
string text = File.ReadAllText(path, isoLatin1); 

總是重要的是你知道你試着去閱讀它作爲文本之前編碼的二進制數據使用。對於文件,網絡流,任何事都是如此。

0

您正在閱讀的字符是替換字符

用於替換值未知或不可代表的傳入字符樂以Unicode 比較使用U + 001A作爲控制字符來指示替代功能

http://www.fileformat.info/info/unicode/char/fffd/index.htm

您收到此,因爲文件的實際編碼不匹配您的程序需要的編碼。

默認情況下,ReadAllText需要UTF-8。它遇到的字節序列不代表有效的UTF-8字符,因此將其替換爲替換字符