.Net Core踩坑記:讀取txt中文亂碼

Mr丶冬發表於2020-06-18

遷移.net framework的專案,有塊讀取txt中文轉碼的問題,普通的不能再普通的程式碼,想都沒想直接copy過去,也沒測,結果今天就被坑了。Core是3.1版本,這是原來的程式碼:

string content = System.IO.File.ReadAllText(fileFullPath, Encoding.Default);
System.IO.File.WriteAllText(fileFullPath, content, Encoding.UTF8);

很基礎的功能,網上一搜一大堆。但是Core直接執行讀取中文還是亂碼,看似一個小問題,百度之,漸漸的發現這是一個小坑坑,於是乎,開始刨根問底。

首先發現兩個環境下 Encoding.Default 這個東西是不同的。官方API解釋:連結

瞅瞅這是人話嗎,為什麼Core就始終返回utf8呢?看了一眼.net framework下的 Encoding.Default,是這個東東。

所以換個編碼就應該就OK了(當然中文字來就是GB2312),結果現實啪啪打臉,居然報錯了(腦補一個笑哭的表情)。

string content1 = System.IO.File.ReadAllText(filePath, Encoding.GetEncoding("GB2312"));

官方API解釋:Encoding.RegisterProvider , CodePagesEncodingProvider.Instance,Core下想支援GetEncoding需要先操作一步:

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

至此,讀取中文正常。

 

但是,按照標準程式設計師的思維,這寫死肯定不對啊。既然人家不支援了,順著思路肯定是想辦法獲取正確的編碼然後進行讀取。因為txt預設是ANSI編碼,所以找了一個.Net Core 讀取ansi編碼的方法,大家可以參考一下。貼上這位大哥的地址:https://www.cnblogs.com/ives/p/10346498.html

一番斷點測試,發現,其實並沒有返回正確的編碼格式,只是預設GB2312,那跟寫死還是沒有區別,於是在茫茫程式碼中,發現一句:Encoding.GetEncoding(0);

又一番斷點測試,發現,在沒有註冊編碼前,Encoding.GetEncoding(0) 等同於 Encoding.Default,但是註冊後 Encoding.GetEncoding(0) 等同於 Encoding.GetEncoding("GB2312")。再次仔細閱讀API,稍微理解了一下這句話,我理解的意思大概是:這麼註冊一下再獲取預設編碼的時候,程式就知道用GB2312了。

總結:  1、.Net Framework 讀取txt用 Encoding.Default 預設就是 GB2312。

     2、.Net Core必須註冊編碼方法 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); 並且用Encoding.GetEncoding(0) 讀取。

     3、官方文件解釋的還是很到位的,就是感覺看起來有點難理解,也不知道是翻譯的問題,還是小弟水平有限。(再腦補一個笑哭的表情)

相關文章