自然語言處理中的unicode編碼轉換問題
半形(half-width/Hankaku) 與 全形(full-with/Zenkaku)
同一字元的兩種unicode編碼。主要是因為排版的需要,便於排版,美觀等因素。
可以將某一個字元的兩種unicode編碼分為稱為主要unicode編碼和次要unicode編碼。
比如說:
英文的大小寫字母、數字、標點的主要unicode編碼位於0x01-0x7F。由於這些字元都是半形的(half-width),所以其對應的全形的(full-width)形式的unicode編碼就是次要unicode編碼,位於0xFF00-OxFFEF
CJK的標點符號,日語的假名的主要unicode編碼都是全形的(full-width),所以其對應的半形(half-width)形式就是次要unicode編碼,也位於0xFF00-OxFFEF
在自然語言處理中,為機器處理方便,可以將所有字元都轉換到主要unicode編碼,也就是不使用0xFF00-OxFFEF區間的編碼。
具體的將英文的大小寫字母、數字、標點轉換到ascii碼錶區間;CJK都轉換到全形(full-width)形式。
注意CJK中有些標點符號跟英文的標點形式是相同,要將這些符號轉換到ascii碼錶區間。
Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS : 4E00-9FBF:CJK 統一表意符號
Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS :F900-FAFF:CJK 相容象形文字 Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A :3400-4DBF:CJK 統一表意符號擴充套件 A
CJK的意思是“Chinese,Japanese,Korea”的簡寫 ,實際上就是指中日韓三國的象形文字的Unicode編碼
Character.UnicodeBlock.GENERAL_PUNCTUATION :2000-206F:常用標點 Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION :3000-303F:CJK 符號和標點 Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS :FF00-FFEF:半形及全形形式
判斷字元中是否包含中文字元時,可以用
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS){
return true;
}
return false;
}