22
public class UTF8 {
    public static void main(String[] args){
        String s = "ヨ"; //0xFF6E
        System.out.println(s.getBytes().length);//length of the string
        System.out.println(s.charAt(0));//first character in the string
    }
}

输出:

3
ヨ

请帮助我理解这一点。试图了解 utf8 编码在 java 中是如何工作的。根据 char char 的 java doc 定义: char 数据类型是单个 16 位 Unicode 字符。

这是否意味着java中的char类型只能支持那些可以用2个字节表示的unicode字符而不是更多?

在上面的程序中,为该字符串分配的字节数为 3,但是在返回第一个字符(java 中为 2 个字节)的第三行中可以容纳一个 3 个字节长的字符?真的很困惑吗?

在 java/general 中有关此概念的任何良好参考将不胜感激。

4

4 回答 4

34
于 2012-08-29T23:27:41.557 回答
4

String.getBytes()使用不需要匹配内部表示的平台的默认字符编码返回字节。

在大多数情况下,最好不要使用这种方法,因为在大多数情况下,依赖平台的默认编码是没有意义的。改为使用String.getBytes(String charsetName)并明确指定应用于将字符串编码为字节的字符集。

于 2012-08-29T23:10:45.413 回答
3

UTF-8 是一种可变长度编码,ASCII 字符仅使用一个字节(0 到 127 之间的值),其他 unicode 符号使用两个、三个(甚至更多)字节。

这是因为字节的高位用于告诉“这是一个多字节序列”,所以 8 上的一位并不是用来实际表示“真实”数据(字符代码)而是用来标记字节。

因此,尽管 Java 在 ram 中为每个字符使用 2 个字节,但当使用 UTF-8 对字符进行“序列化”时,它们可能会在结果字节数组中产生一个、两个或三个字节,这就是 UTF-8 编码的工作方式。

于 2012-08-29T23:07:22.543 回答
3

这就是Java 表示字符的方式。

于 2012-08-29T23:09:51.430 回答