将单个`char`转换为`byte []`,可识别编码

时间:2018-10-19 12:29:33

标签: java character-encoding

有了String的人可以打电话给s.getBytes(charset);,那么单个char的等效功能是什么?例如,我要对“ ”符号进行UTF8编码:

byte[] x = getBytesForChar('♥', StandardCharsets.UTF_8);
       // x should now be {0xE2, 0x99, 0xA5}

什么真正的方法代替了getBytesForChar

当然,我可以将char转换为String,并在其上调用getBytes,但这似乎是不必要的开销。我快速了解了String的实质,但是大多数编码方法都消失在包作用域内部类中

1 个答案:

答案 0 :(得分:0)

AFAIK,有理由使用 String 将字符转换为 byte[]。当您尝试将单个 char 转换为 byte[] 时,会出现问题:移出 / 移入。字符的表示会因字符在字符串中出现的位置而异。

例如,单个日文字符“あ”在 CP930(一种 EBCDIC)中表示为 0x44 0x81。当您将其插入到字符串中时,您需要在多字节字符序列的开头附加一个移出 (0x0e),并在序列的末尾附加一个移入 (0x0f)。

因此,包含单个日语字符“あ”的字符串在 CP930 中将是 0x0e 0x44 0x81 0x0f。以类似的方式,'ああ' 将是 0x0e 0x44 0x81 0x44 0x81 0x0f。在这种情况下,您不能将 0x0e 0x44 0x81 0x0f 插入 0x0e 0x44 0x81 0x44 0x81 0x0f 的中心来获得 'あああ' 的表示。需要根据字符的位置来考虑Shift Out / Shift In的需要。

因此,当您尝试将字符转换为字节数组时,您必须显示该字符的位置以及它周围的其他字符——这意味着字符序列:字符串。