[.NET]檢查文字檔案中是否有BIG5難字

最近同事有一個需求要檢查文字檔案中是否有BIG5難字,如果存在BIG5難字,希望可以把這些字碼留下來,讓系統管理單位可以確認及造字。

哈!花了1個小時實作,再花20分鐘寫筆記下來。

 

BIG5字數

BIG5系統字只支援13,051個字,所以字數不足的部分,多數的銀行就會自己在BIG5造字區域造字。

BIG5造字區範圍: 

造字區1-3+標準保留

 

檢查程式開發

1.準備測試檔案:

其中是使用造字程式做出來的!

堃: BIG5編碼FA40

瀞: BIG5編碼83F8

測試檔案本人:

2.打算直接用Console程式讀取文字檔案,然後轉換為Unicode後再偵測是否落在4個造字區間,如果有就將Unicode及BIG5內碼寫出。

*所以造字區範圍要先Mapping成Unicode造字範圍

public void TestMethod1()
        {

            //定義BIG5編碼對應Unicode編碼造字範圍
            int Range_01_S = Convert.ToInt32(0xE000);
            int Range_01_E = Convert.ToInt32(0xE310);

            int Range_02_S = Convert.ToInt32(0xE311);
            int Range_02_E = Convert.ToInt32(0xEEB7);

            int Range_03_S = Convert.ToInt32(0xEEB8);
            int Range_03_E = Convert.ToInt32(0xF282);

            int Range_04_S = Convert.ToInt32(0xF6B1);
            int Range_04_E = Convert.ToInt32(0xF848);


            //字典寄放
            Dictionary<string, string> BigList = new Dictionary<string, string>();
            BigList.Add("Unicode", "BIG5");

            Encoding big5 = Encoding.GetEncoding("big5");

            string fileName = @"c:\temp\BIG5.TXT";
            string line;
            using (StreamReader file = new StreamReader(fileName, big5))
            {
                while ((line = file.ReadLine()) != null)
                {
                    char[] arr = line.ToString().ToCharArray();
                    for (int i = 0; i < arr.Length; i++)
                    {
                        int value = Convert.ToInt32(arr[i]);

                        if (
                            (value >= Range_01_S && value <= Range_01_E) ||
                            (value >= Range_02_S && value <= Range_02_E) ||
                            (value >= Range_03_S && value <= Range_03_E) ||
                            (value >= Range_04_S && value <= Range_04_E))
                        {

                            string hexOut1 = String.Format("{0:X}", value);
                            if (!BigList.ContainsKey(hexOut1))
                            {

                                byte[] bdata = big5.GetBytes(arr[i].ToString().ToCharArray());
                                string hexOut2 = BitConverter.ToString(bdata).Replace("-", "");
                                BigList.Add(hexOut1, hexOut2);
                            }
                        }
                    }
                }
            }
            foreach (var item in BigList)
            {
                Console.WriteLine($"難字清單: {item.Key},{item.Value}");
            }
        }

 

3.測試結果

正確取出FA40(堃)、83F8(瀞)的BIG5造字區編碼。

打好收工。

 

 

參考:


[SQL Server] BIG5難字寫入資料庫(BIG5篇)

[C#][.NET]16進位字串(Hex string)與位元組陣列Byte[]轉換