当前位置: 首页 > 面试题库 >

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

袁雅逸
2023-03-14
问题内容
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 字符的 java doc定义
:char数据类型是单个16位Unicode字符。

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

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

在Java / General中有关此概念的任何良好参考都将受到赞赏。


问题答案:

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

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

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

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

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



 类似资料:
  • 字符编码是一种将字节转换为字符的方法。 要验证或显示HTML文档,程序必须选择字符编码。 HTML 5作者有三种设置字符编码的方法 - HTTP Content-Type标头 如果您正在编写cgi或类似的程序,那么您将使用HTTP Content-Type标头来设置任何字符编码。 以下是一个简单的例子 - print "Content-Type: text/html; charset=utf-8\

  • 对于Java/general中有关此概念的任何好的参考资料,我们将不胜感激。

  • 问题内容: ’=?KOI8-R?B?W1JFUS0wMDI1NDEtNDc5NzddIO / h7yAi89TSz8rGwdLGz9IiIDs =?= \ r \ n \ t =?KOI8-R?B?Ry43MjkgKDEwKQ ==?=’ 如何将其转换为可读的内容?谢谢 ! 问题答案: email.header.decode_header(‘=?KOI8-R?B?W1JFUS0wMDI1NDEtN

  • 问题内容: 我收到一个json数据对象,然后从中提取一个字符串 然后我尝试使该字符串适合在URL中使用 但它不起作用 如果我对newCountryString进行了硬编码,它将起作用,为什么呢? 问题答案: 用这个 - 此代码将使用给定的编码返回接收方的表示形式,以确定将接收方转换为合法URL字符串所需的转义百分比。 有关更多详细信息:https : //developer.apple.com/d

  • 字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。比如两个字节可以表示的最大整数是655

  • 字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。比如两个字节可以表示的最大整数是655