一般不需要考虑代码单元的长度值,可以简单地认为其与代码点的长度是一样的。只有增补字符,即代码点为 U+10000~U+10FFFF 的字符。在 Java 中一个 Unicode 字符是使用 UTF-16 编码的 char 进行表示的,也就是一个 char 只能表示 U+0000~U+FFFF 的 Unicode 基本字符(BMP, basic multilingual plane)。因此在 Java 中需要表示 U+10000~U+10FFFF 的字符需要使用一对代理字符进行表示,高代理字符的范围为 U+D800~U+DBFF,低代理字符的范围为 U+DC00~U+DFFF。比如表示 U+10400 的字符需要两个 char(U+D801, U+DC00)才能表示,这时的代码点长度为 1,而代码单元长度为 2。举个例子:public class Main { public static void main(String[] args) {
char[] chs = Character.toChars(0x10400);
System.out.printf("U+10400 高代理字符: %04x%n", (int)chs[0]);
System.out.printf("U+10400 低代理字符: %04x%n", (int)chs[1]);
String str = new String(chs);
System.out.println("代码单元长度: " + str.length());
System.out.println("代码点数量: " + str.codePointCount(0, str.length()));
}
}
char[] chs = Character.toChars(0x10400);
System.out.printf("U+10400 高代理字符: %04x%n", (int)chs[0]);
System.out.printf("U+10400 低代理字符: %04x%n", (int)chs[1]);
String str = new String(chs);
System.out.println("代码单元长度: " + str.length());
System.out.println("代码点数量: " + str.codePointCount(0, str.length()));
}
}
解决方案 »
- 自己写的拼图游戏为什么拼不成
- 用java如何实现电子邮件客户端
- 打包问题,
- 500分求教:国外软件源码直接修改.java中字符串汉化编译出来是乱码,试了n种方法还是不行,500分求教各位达人
- 在jbuilder中如何将数据库驱动也打包进jar包
- 这是一个按纽程序,帮我注释一下好吗?或帮我改多几个象这样的按纽谢谢
- java调用外部程序javac.exe时,文件路径如果有空格,怎么避免?
- 用java做打印?
- 各位高手:我想学习JAVA,听说jbuilder不错,请介绍几本入门书,多给一点见意。谢谢。
- 能不能在applet中submit一个html页面。
- 新手请教一道编程题目,corejava的
- 表格组件刷新
code point 表示指定编码格式编码的数量,对于小于 U+FFFF 的字符来说,使用 UTF-16 编码需要一个代码点,大于 U+FFFF 的字符需要使用两个代码点来表示
http://java.sun.com/developer/technicalArticles/Intl/Supplementary/index_zh_CN.html
不好意思哦,code unit 和 code point 的说明正好写反了,呵呵。那天回复是半夜了,估计我在神游了,哈哈
代码单元就是utf-16实现unicode编码采用的基本单元,基本字符用一个代码单元(16bit)表示,增补字符需要用两个。