我在設計用於格式化某些文件的程序中調用File.ReadAllText()
。File.ReadAllText中的字符無效
其中一些文件包含®
(174)符號。但是,正在讀取文本時,返回的字符串包含�
(65533)符號,其中®
(174)應該是。
什麼會導致這種情況,我該如何解決它?
我在設計用於格式化某些文件的程序中調用File.ReadAllText()
。File.ReadAllText中的字符無效
其中一些文件包含®
(174)符號。但是,正在讀取文本時,返回的字符串包含�
(65533)符號,其中®
(174)應該是。
什麼會導致這種情況,我該如何解決它?
這很可能是由於Encoding
中的不匹配造成的。使用ReadAllText超負荷允許您在閱讀文件時指定正確的Encoding
。
默認的重載將採用UTF-8,除非它能夠檢測到UTF-32。任何其他編碼都會不正確。
您需要在調用File.ReadAllText
時指定編碼,除非文件實際上是UTF-8,聽起來好像不是。 (基本上,單參數重載相當於傳入UTF-8作爲第二個參數,它也會用適當的字節順序標記檢測UTF-32,我相信)。
第一件事就是制定出它編碼它是(例如ISO-8859-1 - 但你需要檢查這個),然後將其作爲第二個參數傳遞。
例如:
Encoding isoLatin1 = Encoding.GetEncoding(28591);
string text = File.ReadAllText(path, isoLatin1);
這總是重要的是你知道你試着去閱讀它作爲文本之前編碼的二進制數據使用。對於文件,網絡流,任何事都是如此。
該文件最有可能包含與默認值不同的編碼。如果你知道它,你可以使用File.ReadAllText Method (String, Encoding)覆蓋來指定它。
代碼示例:
string readText = File.ReadAllText(path, Encoding.Default); // <-- change the encoding to whatever the encoding really is
如果不要知道編碼,看到這個以前的SO問題:How to use ReadAllText when file encoding unknown
您正在閱讀的字符是替換字符
用於替換值未知或不可代表的傳入字符樂以Unicode 比較使用U + 001A作爲控制字符來指示替代功能
http://www.fileformat.info/info/unicode/char/fffd/index.htm
您收到此,因爲文件的實際編碼不匹配您的程序需要的編碼。
默認情況下,ReadAllText需要UTF-8。它遇到的字節序列不代表有效的UTF-8字符,因此將其替換爲替換字符。
是否有一個原因,該方法不使用Encoding.Default,因爲它的默認編碼? – mrK 2013-03-18 15:59:19
@mrK不知道爲什麼它是這樣,但這是框架設計師選擇使用的。這是記錄,但我同意,一個奇怪的選擇。 – 2013-03-18 16:03:43
一種解釋可能是'Encoding.Default'使用系統中所謂的當前ANSI代碼頁,這個代碼頁因系統而異。使用UTF-8可避免編碼和解碼在具有不同當前ANSI代碼頁的系統上出現的編碼錯誤。而且UTF-8可以編碼所有的UNICODE。 – 2013-03-18 16:53:49