今天要記錄一個不大不小的事情,因為最近在部署 .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
///
/// 偵測檔案否為BIG5編碼
///
/// 檔案路徑
///
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);
}
///
/// 偵測 byte[]是否為BIG5編碼
///
///
///
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