【发布时间】:2017-07-21 10:52:36
【问题描述】:
我有以下代码从字符串s0 和s1 中打印出字节;输出结果注释:
public static void main(String[] args) throws UnsupportedEncodingException {
String s0="H\u00ebllo";
String s1="Hëllo";
byte[] bytes=s0.getBytes("ISO8859_1"); //72 -21 108 108 111
//byte[] bytes=s1.getBytes("ISO8859_1"); //72 -61 -85 108 108 111
//byte[] bytes=s0.getBytes("UTF-8"); //72 -61 -85 108 108 111
//byte[] bytes=s1.getBytes("UTF-8"); //72 -61 -125 -62 -85 108 108 111
for (int i=0, i<bytes.length; i++) {
System.out.println(bytes[i]);
}
}
我不明白这些数字是从哪里来的。如果所有字符代码都应该是正数,为什么会有负数?为什么第二种情况有6个数字?为什么使用 Unicode 表示法与文字时 ë 字符的数字不同?
编辑:
我知道这些数字首先被转换为无符号数字:
ë(ISO8859_1) = 0xeb = 235 = 11101011 = -21 (two's complement for signed numbers)
ë (UTF-8) = 0xc3 0xab => 0xc3 = 195 = 11000011 = -61, 0xab = 171 = 10101011 = -85
但我仍然不明白s0 和s1 字符串之间的区别。在这两种情况下,我都向getBytes() 请求ISO8859_1 字节,而在第二种情况下,我仍然得到UTF-8 的字节。
编辑:
byte[] bytes=s1.getBytes("UTF-8"); 会产生这个输出:
72 -61 -125 -62 -85 108 108 111
我真的很困惑。
编辑:
System.out.println(System.getProperty("file.encoding"));
System.out.println(java.nio.charset.Charset.defaultCharset());
两者都给UTF-8。源文件在UTF-8。
【问题讨论】:
-
k的目的是什么? -
@Andreas,这是一个更大计划的一部分,出于个人原因需要
k。还是编辑了帖子。 -
同样,您的源文件以 UTF-8 格式存储,因此
ë存储为两个字节。您的编译器采用不同的编码并将 UTF-8ë误解为ë,因此当代码执行时,它对Hëllo一无所知,而只知道Hëllo。 -
内存中的字符串被编码为 UTF-16,而不是 UTF-8。文件编码和内存编码之间存在转换。通过将
String视为字节序列,您无法可靠地获得正确的结果。您必须将其视为char序列。 docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10.5 -
@Markus Benko,但 IDEA 说我的源文件以 UTF-8 (
-Dfile.encoding=UTF-8) 运行,编译器是否使用不同的编码?
标签: java unicode encoding character-encoding ascii