Java中关于char和String对于代码点和代码单元的提问
PHP中文网
PHP中文网 2017-04-18 09:51:35
0
2
839

Java中采用的是Unicode,并且使用UTF-16进行编码.
首先,Unicode中有17个代码层次,除了第一个代码层次意外其余16个代码层次全部需要2个代码单元组成.那么问题就来了:
1.String类的length()方法,在官方API中写明了是返回字符串中包含代码单元的数量,那字符串中如果有中文的话(中文属于其余16个代码层次),那一个中文对应2个代码单元,但我在实际测试当中并非得到这样的结果,而是返回字符的数量(即代码点的数量),而非代码单元的数量.这是我问题之一.
2.char在Java中以16位的形势存在,而1个代码单元占16位.对于第一代码层次UTF-16编码之后的代码单元为16位,对于其它代码层次的代码点编码之后是两个代码单元,即16*2 = 32位.那么一个char类型是不足以储存其它代码层次的代码点,也无法储存需要32位才能存储的中文.但是也实际测得的结果是能够储存的.这是我问题之二.

public class Hello {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    String green = "国家";
    int countUnit = green.length();
    int countPoint = green.codePointCount(0, green.length());
    char character = green.charAt(0);
    System.out.printf(character+" "+countUnit+" "+countPoint);
}//输出结果为国 2 2,但按照这个逻辑应该是"(一个未知的代码单元) 4 2"

}`

PHP中文网
PHP中文网

认证高级PHP讲师

모든 응답(2)
小葫芦

유니코드 문자 인코딩에는 16비트 인코딩과 32비트 인코딩이라는 두 가지 방식이 있습니다. 해당 문자 집합을 각각 USC-2와 USC-4라고 합니다. Java 언어는 16비트 유니코드 문자 인코딩인 USC-2 문자 세트를 사용합니다. 처음 128자는 ASCII 문자 세트와 정확히 동일하며 그 뒤는 라틴어, 그리스어, 중국어 등의 다른 언어가 따릅니다. .

char는 Java에서 2바이트입니다. Java는 유니코드, 2바이트(16비트)를 사용하여 문자를 나타냅니다.

Peter_Zhu

모든 중국어 문자 인코딩이 두 개의 코드 단위를 차지하는 것은 아닙니다. 두 문자 "국가"에 해당하는 유니코드 인코딩은 u56fd u5bb6이며 각 문자는 하나의 단위만 차지합니다. 일부 중국어 문자는 CJK 통합 한자 확장 A에 포함된 문자와 같이 두 개의 코드 단위로 인코딩되어야 합니다. 예: "

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿