cari

Rumah  >  Soal Jawab  >  teks badan

Java中关于char和String对于代码点和代码单元的提问

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中文网2803 hari yang lalu845

membalas semua(2)saya akan balas

  • 高洛峰

    高洛峰2017-04-18 09:53:35

    Pengekodan aksara Unikod mempunyai dua skema: pengekodan 16-bit dan pengekodan 32-bit Set aksara yang sepadan dipanggil USC-2 dan USC-4. Bahasa Java menggunakan set aksara USC-2, iaitu pengekodan aksara Unicode 16-bit. 128 aksara pertama adalah betul-betul sama dengan set aksara ASCII, diikuti dengan bahasa lain, seperti aksara Latin, Yunani, Cina, dsb. .

    char ialah 2 bait dalam java. Java menggunakan Unicode, 2 bait (16 bit) untuk mewakili aksara.

    balas
    0
  • 天蓬老师

    天蓬老师2017-04-18 09:53:35

    Bukan semua pengekodan aksara Cina menduduki dua unit kod Pengekodan Unikod yang sepadan dengan dua aksara "negara" ialah u56fd u5bb6, dan setiap aksara hanya menduduki satu unit. Sesetengah aksara Cina perlu dikodkan dengan dua unit kod, seperti aksara yang disertakan dalam CJK Unified Chinese Character Extension A. Contohnya: "

    balas
    0
  • Batalbalas