[C#] 解決 .NET 6 部署到 Linux 出現亂碼問題的經驗分享

2024-05-29

今天要記錄一個不大不小的事情,因為最近在部署 .NET 6 網站到 Linux 機器上時,出現了亂碼方框的問題。

經過查詢,發現這是編碼問題引起的。雖然預設情況下應該是使用 UTF-8 編碼,但有時候在複製貼上內容時,會自動變成 Big5 編碼。


這樣的情況只能一個個找出來重新儲存,非常麻煩,為了解決這個問題,我決定用程式來解決。以下是我的做法,主要是指定檔案夾後,開啟程式碼並判斷檔案的編碼類型

然後統一改成 UTF-8(編碼 65001)。


C# Code:

//對 D:\Users\Users\Source\repos\Projects\Pages 下面的 *.cs 檔案進行掃描 foreach (var f in new DirectoryInfo(@"D:\Users\Users\Source\repos\Projects\Pages").GetFiles("*.cs", SearchOption.AllDirectories)) { var res = IsBig5Encoding(f.FullName); if (res) { Encoding big5Encoding = CodePagesEncodingProvider.Instance.GetEncoding("Big5"); Encoding utf8Encoding = Encoding.UTF8; var str = File.ReadAllBytes(f.FullName); var utf8Bytes = Encoding.Convert(big5Encoding, utf8Encoding, str); File.WriteAllBytes(f.FullName, utf8Bytes); } } // Ref:http://blog.darkthread.net/post-2012-04-11-detect-big5-encoding.aspx /// <summary> /// 偵測檔案否為BIG5編碼 /// </summary> /// <param name="file">檔案路徑</param> /// <returns></returns> public static bool IsBig5Encoding(string file) { // 檢查檔案是否存在 if (!File.Exists(file)) return false; var big5 = CodePagesEncodingProvider.Instance.GetEncoding("Big5"); var bytes = File.ReadAllBytes(file); return IsBig5Encoding(bytes); } /// <summary> /// 偵測 byte[]是否為BIG5編碼 /// </summary> /// <param name="bytes"></param> /// <returns></returns> public static bool IsBig5Encoding(byte[] bytes) { //https://learn.microsoft.com/zh-tw/windows/win32/intl/code-page-identifiers?redirectedfrom=MSDN var big5 = CodePagesEncodingProvider.Instance.GetEncoding("Big5"); var convertToBig5String = big5.GetString(bytes); return bytes.Length ==big5.GetByteCount(convertToBig5String); }


就筆記一下給之後需要的時候快點就專案檔案一次改好。

reference:

http://blog.darkthread.net/post-2012-04-11-detect-big5-encoding.aspx

https://learn.microsoft.com/zh-tw/windows/win32/intl/code-page-identifiers?redirectedfrom=MSDN



當麻許的碎念筆記 2014 | Donma Hsu Design.