正如java doc所述:
char:char数据类型是一个16位Unicode字符。它的最小值为'\ u0000'(或0),最大值为'\ uffff'(或65,535(含))。
但是当我有一个String(只包含ASCII符号)并将其转换为字节数组时,String的每个符号都存储在一个字节中,小于16位,因为java docs声明它。它是如何工作的?我可以想象java编译器/解释器每个字符只使用一个字节用于性能问题的ASCII符号。
此外,如果我有一个只有ASCII符号的字符串和一个UTF-16符号并将其转换为字节数组,会发生什么。字符串的每个符号现在都使用2个字节?
答案 0 :(得分:4)
使用character encoding将字符转换为字节,反之亦然。
字符编码确定字符如何用字节表示。例如,ASCII是一个字符编码,每个字符使用7位。显然,它只能代表128个字符,小于Java中存在的65,536个字符。
其他字符编码为UTF-8和UTF-16。实际上,Java char
实际上是一个UTF-16字符 - 如果你直接将其转换为int
,你将得到该字符的UTF-16代码。
这是一个更长的字符编码教程:What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text。
如果您在getBytes()
上调用String
,它将使用系统的默认字符编码将字符串中的字符转换为字节。最好使用带有字符集名称作为参数的getBytes()
版本,以便您知道使用了哪个字符集。例如:
byte[] bytes = str.getBytes("UTF-8");
答案 1 :(得分:2)
String的内部格式每个字符使用16位。将其转换为字节数组时,可以使用明确指定的特定字符编码或默认平台编码。编码可以使用每个字符更少的比特。
例如,ASCII编码将每个字符存储在一个字节中,但它只能代表128个不同的字符。
另一种常用的编码是UTF-8,每个字符使用可变数量的字节。前128个字符(对应于ASCII中可用的字符)可以分别存储在一个字节中。订货号为128或更高的字符需要两个或更多字节。
答案 2 :(得分:1)
getBytes()
Encodes this String into a sequence of bytes using the platform's default charset, storing the result into a new byte array.
您平台的默认字符集可能是UTF8。因此,getBytes()将为每个字符使用一个字节,以适应该大小。
答案 3 :(得分:1)
String.getBytes()
“使用平台的默认字符集将此String编码为字节序列,将结果存储到新的字节数组中”。平台的默认字符集(Charset.defaultCharset()
)可能是UTF-8。
至于第二个问题,实际上不需要字符串来使用UTF-16。 JVM在内部存储字符串的方式无关紧要。 JVM规范中出现的少数UTF-16
仅适用于char
s。