为什么UTF-8和UTF-16编码的字符串在Java中不能打印相同的字符串?

时间:2014-04-05 04:33:42

标签: java encoding 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 = "0123456789ABCDEF";
    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版本有几个正方形和块。

为什么他们看起来不一样?

1 个答案:

答案 0 :(得分:2)

Java不会自动找出字符串的编码。

String(byte[])构造函数

  

通过使用平台的默认字符集解码指定的字节数组来构造一个新的字符串。

在你的情况下,UTF-16字节被解释为UTF-8,你最终会得到垃圾。 使用new String(raw, Charset.forName("UTF-16"))重建字符串。