GMs*_*soF 6 java string encoding utf-8
我真的希望下面的字节数据显示不同,但事实上,它们是相同的,根据维基http://en.wikipedia.org/wiki/UTF-8#Examples,字节中的编码看起来不同,但为什么Java打印出来的一样吗?
String a = "€";
byte[] utf16 = a.getBytes(); //Java default UTF-16
byte[] utf8 = null;
try {
utf8 = a.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
for (int i = 0 ; i < utf16.length ; i ++){
System.out.println("utf16 = " + utf16[i]);
}
for (int i = 0 ; i < utf8.length ; i ++){
System.out.println("utf8 = " + utf8[i]);
}
Run Code Online (Sandbox Code Playgroud)
虽然Java在内部将字符保存为UTF-16,但是当您使用转换为字节时String.getBytes(),每个字符都使用默认的平台编码进行转换,这可能类似于windows-1252.我得到的结果是:
utf16 = -30
utf16 = -126
utf16 = -84
utf8 = -30
utf8 = -126
utf8 = -84
Run Code Online (Sandbox Code Playgroud)
这表示我的系统上的默认编码是"UTF-8".
另请注意,String.getBytes()的文档包含以下注释: The behavior of this method when this string cannot be encoded in the default charset is unspecified.
但是,一般情况下,如果您始终指定与您一样的编码,则可以避免混淆 a.getBytes("UTF-8")
另外,另一件可能导致混淆的事情是在源文件中直接包含Unicode字符:String a = "€";.该欧元符号必须编码为存储为文件中的一个或多个字节.当Java编译您的程序时,它会看到这些字节并将它们解码回欧元符号.你希望.你必须确保将欧元符号保存到文件中的软件(记事本,eclipse等)以与Java期望的方式相同的方式对其进行编码.UTF-8正变得越来越流行,但它并不普及并且许多编辑器不会以UTF-8编写文件.