JDK 1.5 對超大字符集的支持
Unicode 與超大字符集
國標(biāo) GB18030 規(guī)定了4字節(jié)擴(kuò)展部分,這部分區(qū)域目前在 Unicode 規(guī)范中作為CJK Ext B區(qū)存在,即常說的中文超大字符集。這部分區(qū)域編碼為 \U20000 - \U2A6D6。
UTF-16與Java String/Character 對象
一個(gè)完整的 Unicode 字符叫 代碼點(diǎn)/CodePoint,而一個(gè) Java char 叫 代碼單元 code unit。
String 對象以UTF-16保存 Unicode 字符,需要用2個(gè)字符表示一個(gè) 超大字符集的漢字,這這種表示方式稱之為 Surrogate,第一個(gè)字符叫 Surrogate High,第二個(gè)就是 Surrogate Low。
判斷一個(gè)char是否是 Surrogate 區(qū)的字符,用 Character的 isHighSurrogate()/isLowSurrogate()方法。
從兩個(gè)Surrogate High/Low 字符,返回一個(gè)完整的 Unicode CodePoint 用 Character.toCodePoint()/codePointAt()方法。
一個(gè) Code Point ,可能需要一個(gè)也可能需要兩個(gè)char表示,因此不能直接使用 CharSequence.length()方法直接返回一個(gè)字符串到底有多少個(gè)漢字,而需要用String.codePointCount()/Character.codePointCount()。
要定位字符串中的第N個(gè)字符,不能直接將 N 作為偏移量,而需要從字符串頭部依次遍歷得到,需要用String/Character.offsetByCodePoints() 方法。
從字符串的當(dāng)前字符,找到上一個(gè)字符,也不能直接用offset -- 實(shí)現(xiàn),而需要用 String.codePointBefore()/Character.codePointBefore(),或用 String/Character.offsetByCodePoints()
從當(dāng)前字符,找下一個(gè)字符,不能直接用 offset ++ 實(shí)現(xiàn),需要判斷當(dāng)前 CodePoint 的長度后,再計(jì)算得到,或用 String/Character.offsetByCodePoints() 。
Swing 對 超大字符集的支持
JTextPane增加了對 超大字符集的支持,只要設(shè)置字體正確,就可以顯示和編輯超大字符集。