最近同事有一個需求要檢查文字檔案中是否有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[]轉換