在 Java 中将 char 表示为字节

2022-09-01 20:22:16

我必须将 char 转换为字节或字节数组。在其他语言中,我知道char只是一个字节。但是,查看 Java 字符类,其最小值为 \u0000,最大值为 \uFFFF。这使得 char 看起来像一个 2 个字节长。

我是否可以将其存储为字节,还是需要将其存储为两个字节?

在有人问之前,我会说我正在尝试这样做,因为我正在一个接口下工作,该接口期望我的结果是一个字节数组。所以我必须将我的字符转换为一。

请让我知道并帮助我理解这一点。

谢谢,jbu


答案 1

要将字符转换为字节,您需要指定字符编码。某些字符编码每个字符使用一个字节,而其他字符编码使用两个或更多字节。实际上,对于许多语言,有太多的字符无法用单个字节进行编码。

在Java中,从字符转换为字节的最简单方法是使用类的getBytes(Charset)方法。(定义了一些常见的编码。但是,此方法将以静默方式替换字符,如果无法在指定的编码下映射该字符。如果需要更多控制,可以配置 CharsetEncoder 以处理此错误情况或使用其他替换字符。String


答案 2

在Java中,char确实是16位(也是唯一的无符号类型!!

如果您确定字符的编码是ASCII,则可以将它们放在一个字节上(因为ASCII仅使用字符的较低7位)。

如果您不需要修改字符,也不需要理解它们在字符串中的含义,则可以将字符存储在两个字节上,例如:

char[] c = ...;
byte[] b = new byte[c.length*2];
for(int i=0; i<c.length; i++) {
    b[2*i] = (byte) (c[i]&0xFF00)>>8; 
    b[2*i+1] = (byte) (c[i]&0x00FF); 
}

(如果速度很重要,建议用右档代替2*)。

但请注意,一些实际的(显示的)字符(或者更准确地说,Unicode 码位)写在两个连续的字符上。因此,在两个字符之间剪切并不能确保在实际字符之间进行剪切。

如果您需要以字符串感知的方式解码/编码或以其他方式操作char数组,则应尝试使用 java.io 工具对char数组或String进行解码和编码,以确保正确的字符操作。