字节数组中char的大小

时间:2014-01-14 21:23:11

标签: java string casting bytearray

正如java doc所述:

  

char:char数据类型是一个16位Unicode字符。它的最小值为'\ u0000'(或0),最大值为'\ uffff'(或65,535(含))。

但是当我有一个String(只包含ASCII符号)并将其转换为字节数组时,String的每个符号都存储在一个字节中,小于16位,因为java docs声明它。它是如何工作的?我可以想象java编译器/解释器每个字符只使用一个字节用于性能问题的ASCII符号。

此外,如果我有一个只有ASCII符号的字符串和一个UTF-16符号并将其转换为字节数组,会发生什么。字符串的每个符号现在都使用2个字节?

4 个答案:

答案 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。