.NET Core - 使用中文編碼(big5)

.Net Core 是 Microsoft 為了主打跨平台所打造的輕量型架構,基本上 .Net Core 會引入一些 .Net Framework 的基本 DLL,但是注意,他引入的基本 DLL 其實已經有瘦身過的,例如System.Text 裏頭就少了許多東西。許多在 .Net Framework 熟悉使用的方法在 .Net Core 可能會消失,像 WebClient 就消失了,所以在 .Net Core 只能使用 HttpClient (聽說未來會將 WebClient 加回去)。本篇就要來提到一個在 .Net Core 改變作法的部分,也就是 Encoding


Encoding 在加解密蠻常用到的,或在轉換中文字或其他非英文字也常用到,以往在 .Net Framework 如果要使用特殊編碼只需要使用 Encoding.GetEncoding 方法就OK了,來看看下列 .Net Framework 上的程式碼:
var str = "s2+sT7T6uNWmcqbq";
var encoding = Encoding.GetEncoding("big5");

var result = encoding.GetString(Convert.FromBase64String(str));

Console.WriteLine(result);

這個範例主要是取得 big5 中文編碼將 base64 bytes 資料轉成中文字串,執行結果會是"這是測試字串"。
看起來一切很美好,但是你如果換用 .Net Core 專案來寫看看會怎樣:



錯誤訊息的意思大概就是說 big5 編碼在目前專案上沒有支援,這時候一定會一股幹意湧出。這是因為 .Net Core 的 System.Text.Encoding.dll 中只保留常用的編碼,像 UTF8, ASCII, URT32 ... 等(這些常用編碼還把他變成屬性),為了瘦身,只好把其他不常用的抽出來到 NuGet Package,所以如果想要使用其他編碼就要去安裝這個 Package。

打開 NuGet Package Explore 安裝 System.Text.Encoding.CodePages,或在 NuGet Package Manager Console 輸入 

Install-Package System.Text.Encoding.CodePages

安裝好就...還沒好哩!
安裝好還要再加上一段程式碼,在程式一開始執行時加入

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); 

這行意思是把套件中的其他編碼註冊到 Encoding 中,CodePagesEncodingProvider 以 Singleton 方式提供 Provider 減少註冊的複雜性。這段程式碼建議放在程式初始化的區塊,例如 ASP.NET Core 就可以放在 Startup Class 裡。下面是修改完的程式碼:
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

var str = "s2+sT7T6uNWmcqbq";
var encoding = Encoding.GetEncoding("big5");

var result = encoding.GetString(Convert.FromBase64String(str));

Console.WriteLine(result);

對於已經習慣 .Net Framework 的開發人員,在開發 .Net Core 一定會覺得卡卡的,因為我們可能要打翻過往的開發經驗,要好好斟酌那些套件是需要哪些是不需要的,這樣才能發揮 .Net Core 的特色。


未來限量會針對一些差異的程式寫法來一篇一篇的揭開 .Net Core 的秘密,大家一起朝 .Net Core 向前邁進吧。

參考來源
Microsoft Docs - Encoding Class




留言

張貼留言