2024年5月15日 星期三

JavaScript : 計算中文字的字數與取Unicode

2024年5月15日 星期三

在檢查我的筆順練習工具是否有抓到教育部「國字標準字體學習網」的全部筆順資料時(根據網站說明,目前收錄 6030個國字,但清單中有 6063個),比對完,發現我少以下幾個字(括號內為 Unicode):

  • 嫏(5ACF)、广(5E7F)、桕(6855)、鯝(9BDD)、𥑮(2546E)、硓(7853)

然後這六個字的音檔都改用 .m4a 的格式了,所以分析音檔路徑的程式也得修改。

另外,在教育部國字標準字體學習網的清單檔案(PDF)中,序號1266的字(Unicode 5F5D),筆順資料庫中目前並沒有,只能找到一個跟它同音的字(Unicode 5F5E)

查了一下全字庫的資料,不細看,實在分不太出來:

兩個字的注音都是「ㄧˊ」。

在新增的六個字裡,「𥑮」的 Unicode 是「2546E」,這讓我發現自己用了十幾年的程式有個大臭蟲。

原來我在 JavaScript 中,用來計算多少個字,都是直接用 .length 來取得,例如:

var words = '這是新的字𥑮';
console.log(words.length);

照以前的經驗,應該會顯示結果為「6」;今天遇到「𥑮」就變成「7」了!

原來「𥑮」這個字是 UTF-32 的,而 JavaScript 是 UTF-16 的環境,所以 '𥑮'.length 會是「2」。這下子,我的程式遇到這些 UTF-32 的字就全亂了!

沒關係,總有解決方法的。利用 Array.from 可以將字串的字一個個地切開,並放入陣列中,我只要取陣列有幾個元素就好了,可以利用這個來測試:

var words = '這是新的字𥑮';
console.log( Array.from(words) );

它會顯似這樣的結果:

(6) ['這', '是', '新', '的', '字', '𥑮']

另一個問題是如何取得中文字的 Unicode?

以前我是使用 charCodeAt(0) 來取得 Unicode,像這樣:

'𥑮'.charCodeAt(0).toString(16).toUpperCase()

但是因為「𥑮」是 UTF-32 的,所以得改用 codePointAt(0) 才行:

'𥑮'.codePointAt(0).toString(16).toUpperCase()

哈!有時遇到新的狀況,時間要花很多,但是問題得以解決,更是開心啊!不過,程式改東改西,還得再觀察個幾天再上線的好,不然,掃了使用者的興可不好。

相關文章


沒有留言:

張貼留言

 
雄::gsyan © 2009. Design by Pocket