Java内部字符串表示:是UTF-16吗?
我发现Java字符串在内部表示为UTF-16。出于好奇,我开发并运行了以下代码段(Java 7): 这导致:Java内部字符串表示:是UTF-16吗?,java,string,utf-8,Java,String,Utf 8,我发现Java字符串在内部表示为UTF-16。出于好奇,我开发并运行了以下代码段(Java 7): 这导致: [65, 66, 67] 正在打印到控制台输出 它如何与UTF-16匹配 更新。有没有办法编写一个程序,按原样打印字符串的内部字节?您似乎误解了什么 对于所有的系统关心,而且大多数时候,开发人员关心,chars也可以是信鸽,并且Strings是所述信鸽的序列。虽然是的,但在内部,字符串是chars的序列(更准确地说是UTF-16代码单元),这不是这里的问题 您不会将chars写入文件,
[65, 66, 67]
正在打印到控制台输出
它如何与UTF-16匹配
更新。有没有办法编写一个程序,按原样打印字符串的内部字节?您似乎误解了什么 对于所有的系统关心,而且大多数时候,开发人员关心,
char
s也可以是信鸽,并且String
s是所述信鸽的序列。虽然是的,但在内部,字符串是char
s的序列(更准确地说是UTF-16代码单元),这不是这里的问题
您不会将char
s写入文件,也不会从文件中读取char
s。您可以写入和读取字节
为了将字节序列作为字符/信鸽序列读取,需要一个解码器;类似地(这里就是这么做的),为了将字符/信鸽转换成字节,您需要一个编码器。在Java中,这两种方法都可以从
String.getBytes()
恰好使用了带有默认平台字符编码的编码器(使用Charset.defaultCharset()
获得),而且对于输入字符串“ABC”
和JRE实现,生成的字节序列恰好是65、66、67。结果就是这样
现在,尝试使用
String.getBytes(Charset.forName(“UTF-32LE”))
,您将得到不同的结果。您似乎误解了什么
对于所有的系统关心,而且大多数时候,开发人员关心,char
s也可以是信鸽,并且String
s是所述信鸽的序列。虽然是的,但在内部,字符串是char
s的序列(更准确地说是UTF-16代码单元),这不是这里的问题
您不会将char
s写入文件,也不会从文件中读取char
s。您可以写入和读取字节
为了将字节序列作为字符/信鸽序列读取,需要一个解码器;类似地(这里就是这么做的),为了将字符/信鸽转换成字节,您需要一个编码器。在Java中,这两种方法都可以从
String.getBytes()
恰好使用了带有默认平台字符编码的编码器(使用Charset.defaultCharset()
获得),而且对于输入字符串“ABC”
和JRE实现,生成的字节序列恰好是65、66、67。结果就是这样
现在,尝试使用
String.getBytes(Charset.forName(“UTF-32LE”))
,您将得到一个不同的结果。Java字符串确实在内部表示为UTF-16,但您正在调用getBytes
方法,该方法执行(我的重点)
使用平台的
默认字符集,将结果存储到新的字节数组中
您的平台的默认编码可能不是UTF-16
如果使用允许指定编码的变量,则可以查看字符串在其他编码中的外观:
public byte[] getBytes(Charset charset)
如果您查看for
java.lang.String
,您可以看到该字符串在内部存储为一个(16位)字符数组。java字符串确实在内部表示为UTF-16,但您正在调用getBytes
方法,该方法执行(我的重点)
使用平台的
默认字符集,将结果存储到新的字节数组中
您的平台的默认编码可能不是UTF-16
如果使用允许指定编码的变量,则可以查看字符串在其他编码中的外观:
public byte[] getBytes(Charset charset)
如果查看for
java.lang.String
,可以看到该字符串在内部存储为一个(16位)字符数组。java的内部字符串表示是基于它们的char
和UTF-16。:现代虚拟机(自Java6Update21PerformanceRelease以来)可能会尝试通过使用基本ASCII(单字节编码)来节省空间,这就足够了 序列化/java本机接口采用(UTF-8的代理不可知变量)编码,NUL表示为两个字节,以避免嵌入零 所有这些都与您的“测试”无关:
,这不是内部字符集: 使用平台的默认字符集将此字符串编码为字节序列,并将结果存储到新的字节数组中。
当此字符串无法在默认字符集中编码时,此方法的行为未指定。当需要对编码过程进行更多控制时,应使用CharsetEncoder类
Java的内部字符串表示基于它们的
char
,因此是UTF-16。:现代虚拟机(自Java6Update21PerformanceRelease以来)可能会尝试通过使用基本ASCII(单字节编码)来节省空间,这就足够了 序列化/java本机接口采用(UTF-8的代理不可知变量)编码,NUL表示为两个字节,以避免嵌入零 所有这些都与您的“测试”无关:
,这不是内部字符集: 使用平台的默认字符集将此字符串编码为字节序列,并将结果存储到新的字节数组中。
当此字符串无法在默认字符集中编码时,此方法的行为未指定。当需要对编码过程进行更多控制时,应使用CharsetEncoder类
@Dia如何与“Java将字符串作为UTF-16在内部存储,每个字符使用2个字节”配合使用?请参阅@Dia
public byte[] getBytes(Charset charset)
public byte[] getBytes()