java utf8 编码 - 字符,字符串类型

2022-09-02 00:49:20
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中是如何工作的。根据 java doc 对 char char 的定义:char 数据类型是单个 16 位 Unicode 字符。

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

在上面的程序中,为该字符串分配的字节数为3,但在返回第一个字符的第三行(java中为2个字节)中,可以容纳一个长度为3个字节的字符?这里真的糊涂了?

任何关于java/一般概念的良好参考将不胜感激。


答案 1

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

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

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

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

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


答案 2

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

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


推荐