java utf8编码 – char,字符串类型

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中对这个概念的任何好的参考将非常感激。

您的代码示例中没有任何内容直接使用UTF-8。 Java字符串使用UTF-16编码在内存中。 不适合单个16位字符的Unicode代码点将使用称为代理项对的2字符对进行编码。

如果未将参数值传递给String.getBytes() ,则返回一个字节数组,该数组具有使用底层操作系统的默认字符集编码的String内容。 如果要确保UTF-8编码的arrays,则需要使用getBytes("UTF-8")

调用String.charAt()仅从String的内存存储中返回原始UTF-16编码的char。

因此,在您的示例中,Unicode字符使用两个UTF-16编码的字节( 0x6E 0xFF0xFF 0x6E取决于字节序)存储在String内存中,但是使用getBytes()存储在字节数组中使用操作系统默认字符集编码的三个字节。

在UTF-8中,该特定Unicode字符恰好也使用3个字节( 0xEF 0xBD 0xAE )。

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

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

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

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

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

这就是Java代表字符的方式: http : //docs.oracle.com/javase/7/docs/api/java/lang/Character.html#unicode