在字节变量中强制使用 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
.
我最近发现您可以通过以下方式将字符串转换为字节数组:
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
.