Java 在字节变量中强制使用Unicode
我最近发现,可以通过以下方式将字符串转换为字节数组:Java 在字节变量中强制使用Unicode,java,string,unicode,byte,bytearray,Java,String,Unicode,Byte,Bytearray,我最近发现,可以通过以下方式将字符串转换为字节数组: String S = "ab"; byte arr[] = S.getBytes(); 现在,我尝试使用字符串“\u9999”,结果是[63]。我想应该是9999(mod 128)=15,这实际上是我们做字节b=9999得到的。63背后的原因是什么?对于Unicode字符,可以在调用getBytes时指定编码: byte arr[] = S.getBytes("UTF8"); 至于为什么会得到63,在没有参数的情况下调用getBytes将
String S = "ab";
byte arr[] = S.getBytes();
现在,我尝试使用字符串
“\u9999”
,结果是[63]
。我想应该是9999(mod 128)=15,这实际上是我们做字节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()
按预期返回数据0x9999
。)
当此字符串无法在中编码时,此方法的行为
默认字符集未指定。
(来源:)
我的建议是简单地使用“\u9999.getBytes(StandardCharsets.utf16le)
(或utf16be
)来获得所需的2字节数组。因此,不需要关心java源代码的编码。数组应该是{-103,-103}
值为
-103
的byte
在内存中表示为0x99
您说“答案是[63]”是什么意思?什么答案?我的意思是绝对正确。另见: