繁体   English   中英

字节数组中char的大小

[英]Size of a char in a byte array

正如java doc所述:

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

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

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

使用字符编码将字符转换为字节,反之亦然。

字符编码确定字符如何用字节表示。 例如, ASCII是一种字符编码,每个字符使用7位。 显然,它只能代表128个字符,比Java中存在的65,536个字符少。

其他字符编码为UTF-8和UTF-16。 事实上,Java char实际上是一个UTF-16字符 - 如果你直接将它转换为int ,你将获得该字符的UTF-16代码。

这是一个更长的字符编码教程: 每个程序员绝对需要了解编码和字符集以处理文本

如果在String上调用getBytes() ,它将使用系统的默认字符编码将字符串中的字符转换为字节。 最好使用带有字符集名称作为参数的getBytes()版本,以便您知道使用了哪个字符集。 例如:

byte[] bytes = str.getBytes("UTF-8");

String的内部格式每个字符使用16位。 将其转换为字节数组时,可以使用明确指定的特定字符编码或默认平台编码。 编码可以使用每个字符更少的比特。

例如,ASCII编码将每个字符存储在一个字节中,但它只能代表128个不同的字符。

另一种常用的编码是UTF-8,每个字符使用可变数量的字节。 前128个字符(对应于ASCII中可用的字符)可以分别存储在一个字节中。 订单号为128或更高的字符需要两个或更多字节。

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()将为每个字符使用一个字节,以适应该大小。

String.getBytes() “使用平台的默认字符集将此String编码为字节序列,将结果存储到新的字节数组中”。 平台的默认字符集( Charset.defaultCharset() )可能是UTF-8。

至于第二个问题,实际上不需要字符串来使用UTF-16。 JVM在内部存储字符串的方式无关紧要。 JVM规范中少数出现的UTF-16仅适用于char

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM