Posted on 2005-12-09 11:27
笨笨 阅读(3577)
评论(2) 编辑 收藏 所属分类:
Java
JDK 1.5 对超大字符集的支持
Unicode 与超大字符集
国标 GB18030 规定了4字节扩展部分,这部分区域目前在 Unicode 规范中作为CJK Ext B区存在,即常说的中文超大字符集。这部分区域编码为 \U20000 - \U2A6D6。
UTF-16与Java String/Character 对象
一个完整的 Unicode 字符叫 代码点/CodePoint,而一个 Java char 叫 代码单元 code unit。
String 对象以UTF-16保存 Unicode 字符,需要用2个字符表示一个 超大字符集的汉字,这这种表示方式称之为 Surrogate,第一个字符叫 Surrogate High,第二个就是 Surrogate Low。
判断一个char是否是 Surrogate 区的字符,用 Character的 isHighSurrogate()/isLowSurrogate()方法。
从两个Surrogate High/Low 字符,返回一个完整的 Unicode CodePoint 用 Character.toCodePoint()/codePointAt()方法。
一个 Code Point ,可能需要一个也可能需要两个char表示,因此不能直接使用 CharSequence.length()方法直接返回一个字符串到底有多少个汉字,而需要用String.codePointCount()/Character.codePointCount()。
要定位字符串中的第N个字符,不能直接将 N 作为偏移量,而需要从字符串头部依次遍历得到,需要用String/Character.offsetByCodePoints() 方法。
从字符串的当前字符,找到上一个字符,也不能直接用offset -- 实现,而需要用 String.codePointBefore()/Character.codePointBefore(),或用 String/Character.offsetByCodePoints()
从当前字符,找下一个字符,不能直接用 offset ++ 实现,需要判断当前 CodePoint 的长度后,再计算得到,或用 String/Character.offsetByCodePoints() 。
Swing 对 超大字符集的支持
JTextPane增加了对 超大字符集的支持,只要设置字体正确,就可以显示和编辑超大字符集。