【发布时间】:2020-04-06 11:37:04
【问题描述】:
我正在使用此代码将 UTF-8 String 转换为二进制:
public String toBinary(String str) {
byte[] buf = str.getBytes(StandardCharsets.UTF_8);
StringBuilder result = new StringBuilder();
for (int i = 0; i < buf.length; i++) {
int ch = (int) buf[i];
String binary = Integer.toBinaryString(ch);
result.append(("00000000" + binary).substring(binary.length()));
result.append(' ');
}
return result.toString().trim();
}
在我使用这段代码之前:
private String toBinary2(String str) {
StringBuilder result = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
int ch = (int) str.charAt(i);
String binary = Integer.toBinaryString(ch);
if (ch<256)
result.append(("00000000" + binary).substring(binary.length()));
else {
binary = ("0000000000000000" + binary).substring(binary.length());
result.append(binary.substring(0, 8));
result.append(' ');
result.append(binary.substring(8));
}
result.append(' ');
}
return result.toString().trim();
}
这两种方法可以返回不同的结果;例如:
toBinary("è") = "11000011 10101000"
toBinary2("è") = "11101000"
我认为这是因为 è 的字节是负数,而对应的 char 不是(因为 char 是一个 2 字节的无符号整数)。
我想知道的是:这两种方法中哪一种是正确的,为什么?
提前致谢。
【问题讨论】:
-
首先,您需要了解 Java 中没有“UTF-8 字符串”之类的东西。所有字符串(至少在概念上)都是 UTF-16 代码单元的序列。您的
toBinary2方法根本没有执行任何 UTF-8 编码,这就是它不正确的原因。您需要将代码的两部分分开,至少在您的脑海中:1)将字符串转换为二进制数据(byte[]),例如与getBytes。 2) 将该二进制数据转换为文本二进制表示。