【转】Java中的代码点与代码单元
2015-11-03 15:03
399 查看
转载自:http://blog.csdn.net/xujinsmile/article/details/8526387
最近看core java,之前一直不明白,看了不少帖子和博客,总算搞明白了。
Java中,char[]、String、StringBuilder和StringBuffer类中采用了UTF-16编码,使用U+0000~U+FFFF来表示一个基本字符(BMP字符),但是位于U+D800到U+DBFF和U+DC00到U+DFFF的char被视为无定义字符。大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示。即:基本字符用一个char表示,辅助字符使用一对char表示。
Java使用代码点(Unicode code pointer)这个概念来表示范围在U+0000与U+10FFFF之间的字符值(int型),代码单元(Unicode code unit)表示作为UTF-16编码的代码单元的 16位char值(char型)。也就是说,可能存在一个字符,它的代码点数量是1,而代码单元数量是2。所以,代码单元的数量并不一定是字符的数量。
相比之下,代码单元更加偏底层。
相关函数:
length()函数返回采用UTF-16编码标识的给定字符串所需要的代码单元的数量。
codePointCount()函数返回采用UTF-16编码标识的给定字符串所需要的代码点的数量。
参考资料:
http://bbs.csdn.net/topics/340195349 http://blog.csdn.net/longyulu/article/details/7374862
最近看core java,之前一直不明白,看了不少帖子和博客,总算搞明白了。
Java中,char[]、String、StringBuilder和StringBuffer类中采用了UTF-16编码,使用U+0000~U+FFFF来表示一个基本字符(BMP字符),但是位于U+D800到U+DBFF和U+DC00到U+DFFF的char被视为无定义字符。大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示。即:基本字符用一个char表示,辅助字符使用一对char表示。
Java使用代码点(Unicode code pointer)这个概念来表示范围在U+0000与U+10FFFF之间的字符值(int型),代码单元(Unicode code unit)表示作为UTF-16编码的代码单元的 16位char值(char型)。也就是说,可能存在一个字符,它的代码点数量是1,而代码单元数量是2。所以,代码单元的数量并不一定是字符的数量。
相比之下,代码单元更加偏底层。
相关函数:
length()函数返回采用UTF-16编码标识的给定字符串所需要的代码单元的数量。
codePointCount()函数返回采用UTF-16编码标识的给定字符串所需要的代码点的数量。
public class Solution3 { public static void main(String[] args) { System.out.println((char)0x10400); char[] ch = Character.toChars(0x10400); System.out.printf("U+10400 高代理字符: %04x\n", (int)ch[0]);//d801 System.out.printf("U+10400 低代理字符: %04x\n", (int)ch[1]);//dc00 String str = new String(ch); System.out.println("str::"+str); System.out.println("代码单元长度: " + str.length());//2 System.out.println("代码点数量: " + str.codePointCount(0, str.length()));//1 System.out.println(str.codePointAt(0));//返回给定位置开始或结束的代码点,66560 System.out.println(str.charAt(1));//返回给定位置的代码单元,由于未定义,返回? //遍历一个字符串,打印出所有字符的代码点 str += "Hello,world!"; int i = 0; int cp = str.codePointAt(i); while(i < str.length()){ System.out.println(str.codePointAt(i)); if(Character.isSupplementaryCodePoint(cp)) i += 2;//如果cp所在的位置是代码点的第一部分,执行此处 else i++; } } }
参考资料:
http://bbs.csdn.net/topics/340195349 http://blog.csdn.net/longyulu/article/details/7374862
相关文章推荐
- spring的初体验,创建一个helloworld的程序
- Eclipse中clean server失败
- eclipse ctrl+左键失效
- java中class文件的结构的介绍
- Eclipse打war包方法以及Eclipse移植项目时JDK版本不匹配Project facet Java version 1.7 is not supported
- Java的类演进过程
- JAVA中执行顺序
- Java编码问题汇总(转)
- java的equals、hashcode和Clone方法
- java编写WebSocket服务端
- Eclipse快捷键大全
- MyEclipse快捷键大全
- Orangevolt Eclipse XSLT 插件简介
- java的进制转换
- spring对事务的捕获
- Spring定时任务的几种实现
- Java实现从数据库导出大量数据记录并保存到文件的方法
- 基础:Eclipse开发JAVA中如何Debug
- java Timer 定时任务(一)
- Java中系统属性Properties介绍