JDK1.5加入了对unicode4.0规范添的支持,主要特点是添加了对unicode中Supplementary Characters(增补码)的支持。(关于JDK1.5对UNICODE4.0的支持,请参照sun的官方文档)
众所周知,JAVA中字符串对象是用UNICODE来表示数据的,使用的格式是UTF-16格式。但增补码是在双字节范围之外的(需要更多的字节表示),换言之也就是JAVA的现有字符串类型更本无法表现出这种数据,其实说的再深入点应该是char这种基本类型没有办法描述这种类型。那JDK1.5是怎么解决这个问题的呢?
为了兼容以前的程序,这次JCP成员组选用了一个折衷的解决方案。他们使用了两个char来表示这样的一个字符,以前可以表示的字符还是使用以前的格式,这样就能兼容以前的程序。
但随之而来的问题也出现了,以前String 中的length()方法返回String对象中char的个数,既然现在有的字符需要两个char来表现,那这个方法不就不对了吗?是的,这个方法确实不对了。解决的办法是使用如下代码来判断一个字符串中有多少字符:
string.codePointCount(0, string.length());
使用getBytes方法还是能够正确得到String的byte数。这点和以前一样。
参照程序:
package angelo.test;
import java.io.UnsupportedEncodingException;
public class UnicodeTest4Jdk5 {
/**
* 测试jdk1.5中对Supplementary Characters的支持,主要测试String.length(),和getBytes()方法的正确性。
* @param args
*/
public static void main(String[] args) {
//以下两个byte数组分别代表一个中文,后一个属于增补码范围。使用utf-8编码。
byte [] b1 = {(byte)0xE5, (byte)0x8D, (byte)0x97};
//
byte [] b2 = {(byte)0xF0, (byte)0xA0, (byte)0x80, (byte)0x95};
//
try {
String s1 = new String(b1, "UTF-8");
String s2 = new String(b2, "UTF-8");
System.out.println(s1 + "\n" + s2);
System.out.println(s1.getBytes("UTF-8").length + "\n" + s2.getBytes("UTF-8").length);
System.out.println(s1.length() + "\n" + s2.length());
System.out.println(s1.codePointCount(0, s1.length()) + "\n" + s2.codePointCount(0, s2.length()));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
阅读(1424) | 评论(0) | 转发(0) |