Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java内部字符串表示:是UTF-16吗?_Java_String_Utf 8 - Fatal编程技术网

Java内部字符串表示:是UTF-16吗?

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写入文件,

我发现Java字符串在内部表示为UTF-16。出于好奇,我开发并运行了以下代码段(Java 7):

这导致:

[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()