zoukankan      html  css  js  c++  java
  • 【转】Java中的代码点与代码单元

    转载自: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编码标识的给定字符串所需要的代码点的数量。

     1 public class Solution3 {
     2     public static void main(String[] args) {
     3               System.out.println((char)0x10400);
     4               char[] ch = Character.toChars(0x10400);
     5 
     6             System.out.printf("U+10400 高代理字符: %04x
    ", (int)ch[0]);//d801  
     7             System.out.printf("U+10400 低代理字符: %04x
    ", (int)ch[1]);//dc00     
     8             String str = new String(ch);
     9             System.out.println("str::"+str);
    10             System.out.println("代码单元长度: " + str.length());//2  
    11             System.out.println("代码点数量: " + str.codePointCount(0, str.length()));//1  
    12             System.out.println(str.codePointAt(0));//返回给定位置开始或结束的代码点,66560  
    13             System.out.println(str.charAt(1));//返回给定位置的代码单元,由于未定义,返回?  
    14               
    15             //遍历一个字符串,打印出所有字符的代码点  
    16             str += "Hello,world!";  
    17             int i = 0;  
    18             int cp = str.codePointAt(i);  
    19             while(i < str.length()){  
    20                 System.out.println(str.codePointAt(i));  
    21                 if(Character.isSupplementaryCodePoint(cp))  
    22                     i += 2;//如果cp所在的位置是代码点的第一部分,执行此处  
    23                 else i++;  
    24             }  
    25     }
    26 }

    参考资料:

    http://bbs.csdn.net/topics/340195349

    http://blog.csdn.net/longyulu/article/details/7374862

  • 相关阅读:
    大前端的自动化工厂(1)——Yeoman
    推荐两个漂亮的编程字体
    javascript基础修炼(3)—What's this(下)
    javascript基础修炼(2)——What's this(上)
    javascript基础修炼(1)——一道十面埋伏的原型链面试题
    2018年8月中级前端开发推荐书籍
    React组件方法中为什么要绑定this
    Angularjs进阶笔记(2)-自定义指令中的数据绑定
    Angularjs1.X进阶笔记(1)—两种不同的双向数据绑定
    mysql多表查询
  • 原文地址:https://www.cnblogs.com/scecit/p/4933261.html
Copyright © 2011-2022 走看看