在字节变量中强制使用 Unicode

Forcing Unicode in byte variable

我最近发现您可以通过以下方式将字符串转换为字节数组:

String S = "ab";
byte arr[] = S.getBytes();

现在,我尝试使用字符串 "\u9999",答案是 [63]。我认为它会是 9999 (mod 128) = 15 这实际上是我们做 byte b = 9999 得到的结果。 63背后的原因是什么?

对于 Unicode 字符,您可以在对 getBytes:

的调用中指定编码
byte arr[] = S.getBytes("UTF8");

就您得到 63 结果的原因而言,不带参数的 getBytes 调用使用您平台的默认编码。字符 \u9999 无法在您的默认编码中正确表示,因此会变成 ?,在 ASCII 中具有十进制值 63

这是关于默认字符集的。这可能与您的 java 文件的编码有关。

(在我的机器上,当我用 cp1252 编码编译 java 文件时,getBytes() 似乎也使用 cp1252 作为默认字符集。由于 cp1252 不支持 unicode 字符,它变成? 字符,即 63。当我使用 UTF-16 编码编译 java 时,getBytes() returns 数据 0x9999 符合预期。 )

The behavior of this method when this string cannot be encoded in the default charset is unspecified. (Source: getBytes() from oracle.com)

我的建议是简单地使用"\u9999".getBytes(StandardCharsets.UTF_16LE)(或UTF_16BE)来获得你想要的2字节数组。因此无需担心 java 源代码的编码。该数组应为 {-103,-103}.

值为 -103

byte 在内存中表示为 0x99.