java - UTF-16编码问题
黄舟
黄舟 2017-04-17 17:59:08
0
2
970
        String str1="a";
        String str2="b";
        String str3="c";
        String str4="abc";
        System.out.println(str1.getBytes("UTF-16").length);//4
        System.out.println(str2.getBytes("UTF-16").length);//4
        System.out.println(str3.getBytes("UTF-16").length);//4
        System.out.println(str4.getBytes("UTF-16").length);//8

        System.out.println(str1.getBytes("UTF-8").length);//1
        System.out.println(str2.getBytes("UTF-8").length);//1
        System.out.println(str3.getBytes("UTF-8").length);//1
        System.out.println(str4.getBytes("UTF-8").length);//3

        System.out.println(str1.getBytes("UTF-32").length);//4
        System.out.println(str2.getBytes("UTF-32").length);//4
        System.out.println(str3.getBytes("UTF-32").length);//4
        System.out.println(str4.getBytes("UTF-32").length);//12

Unicde编码中不明白的,像UTF-8/UTF-32中str4编码后字节数都是str1+str2+str3,但UTF-16则不然,UTF-16到底是如何编码的呢?求赐教。

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

모든 응답(2)
黄舟

UTF-16은 최소 2바이트의 가변 길이 인코딩 형식입니다. 2바이트이기 때문에 Big Endian과 Small Endian이 포함됩니다. 위의 예에서는 endianess가 지정되지 않았기 때문에 2바이트 BOM이 추가됩니다. 여기에 원래 문자(ASCII) 인코딩의 2바이트를 추가하면 4바이트가 됩니다. utf-16-le 또는 utf-16-be를 사용하는 경우 2바이트가 됩니다. 특정 Java 표현을 직접 확인하세요.

刘奇

UTF-16 디코딩 후

으아악

의 시작 부분에는 문자열이 빅엔디안(상위 바이트가 앞에 있음)임을 나타내는 데 사용되는 feff가 있습니다. 이 표시가 있는 이유는 빅엔디안에는 두 가지 유형이 있기 때문입니다. 그리고 시스템 모드에서는 little-endian(상위 바이트가 뒤에 있음)을 사용하는데, 0x01 0x02는 big endian에서 0x0102로 읽혀지고, little endian에서는 같은 값이 0x0201로 읽혀지므로 차이가 있습니다. feff로 표시됩니다.

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