1
我不明白为什么这段代码不输出相同的东西?我以为Java自动计算出字符串的编码?为什么UTF-8和UTF-16编码的字符串在Java中打印不一样?
public static void main (String[] args) {
try {
displayStringAsHex("A B C \u03A9".getBytes("UTF-8"));
System.out.println ("");
displayStringAsHex("A B C \u03A9".getBytes("UTF-16"));
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
}
}
/**
* I got part of this from: http://rgagnon.com/javadetails/java-0596.html
*/
public static void displayStringAsHex(byte[] raw) {
String HEXES = "ABCDEF";
System.out.println("raw = " + new String(raw));
final StringBuilder hex = new StringBuilder(2 * raw.length);
for (final byte b : raw) {
hex.append(HEXES.charAt((b & 0xF0) >> 4))
.append(HEXES.charAt((b & 0x0F))).append(" ");
}
System.out.println ("hex.toString() = "+ hex.toString());
}
输出:
(UTF-8)
hex.toString() = 41 20 42 20 43 20 CE A9
(UTF 16)
hex.toString() = FE FF 00 41 00 20 00 42 00 20 00 43 00 20 03 A9
我无法显示字符输出,但UTF-8版本看起来是正确的。 UTF-16版本有几个正方形和块。
为什么他们看起来不一样?
他们为什么会输出同样的东西? UTF-8和UTF-16是两种完全不同的编码方案。这与“Java自动计算编码”无关。这是一个问题,无论你用什么来显示编码文本都可以找出编码。 – JLRishe
实际上它们看起来是相同的,如果首先注意到的UTF-8字符串模式发生在第二字符串中的UTF-16,检查序列:41 20 42 20 43 20 因为UTF-16的地址大小的比双UTF-8它可以映射更多种语言: 也许这个问题的答案可能有所帮助: http://stackoverflow.com/questions/4655250/difference-between-utf-8-and-utf-16 – guilhebl