Chinaunix首页 | 论坛 | 博客
  • 博客访问: 706344
  • 博文数量: 214
  • 博客积分: 5015
  • 博客等级: 大校
  • 技术积分: 2285
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-18 17:02
文章分类

全部博文(214)

文章存档

2008年(43)

2007年(171)

我的朋友

分类:

2008-04-25 10:39:39

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();
  }
 }
}
阅读(1426) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~