2014-04-05 19 views
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版本有几个正方形和块。

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

+0

他们为什么会输出同样的东西? UTF-8和UTF-16是两种完全不同的编码方案。这与“Java自动计算编码”无关。这是一个问题,无论你用什么来显示编码文本都可以找出编码。 – JLRishe

+0

实际上它们看起来是相同的,如果首先注意到的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

回答

2

Java不自动计算出一个字符串的编码。

String(byte[])构造

由指定的使用平台的默认charset.`

在你的情况的字节数组的UTF-16个字节被解释为UTF解码构建一个新的String -8,你最终得到垃圾。 使用new String(raw, Charset.forName("UTF-16"))来重建字符串。

+0

谢谢!这解决了它。 –

相关问题