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"
}`
高洛峰2017-04-18 09:53:35
Unicode 文字エンコーディングには、16 ビット エンコーディングと 32 ビット エンコーディングの 2 つのスキームがあり、対応する文字セットはそれぞれ USC-2 と USC-4 と呼ばれます。 Java 言語は、16 ビット Unicode 文字エンコーディングである USC-2 文字セットを使用し、最初の 128 文字は ASCII 文字セットとまったく同じで、その後にラテン語、ギリシャ語、中国語などの他の言語が続きます。 。
char は Java では 2 バイトです。 Java では、Unicode、2 バイト (16 ビット) を使用して文字を表現します。
天蓬老师2017-04-18 09:53:35
すべての中国語の文字エンコーディングが 2 つのコード単位を占有するわけではありません。「国」という 2 つの文字に対応する Unicode エンコーディングは u56fd u5bb6 であり、各文字は 1 つの単位のみを占有します。 CJK Unified Chinese Character Extension A に含まれる文字など、一部の中国語の文字は 2 つのコード単位でエンコードする必要があります。例: "