编辑:我一直相信这个问题有点荒谬。感谢那些回复的人。我可能会发布一个更具体的后续问题。
今天我投入了一些编码问题并编写了这个单元测试来隔离一个基本的重现案例:
int badCount = 0;
for (int i = 1; i < 255; i++) {
String str = "Hi " + new String(new char[] { (char) i });
String toLatin1 = new String(str.getBytes("UTF-8"), "latin1");
assertEquals(str, new String(toLatin1.getBytes("latin1"), "UTF-8"));
String toWin1252 = new String(str.getBytes("UTF-8"), "Windows-1252");
String fromWin1252 = new String(toWin1252.getBytes("Windows-1252"), "UTF-8");
if (!str.equals(fromWin1252)) {
System.out.println("Can't encode: " + i + " - " + str +
" - encodes as: " + fromWin1252);
badCount++;
}
}
System.out.println("Bad count: " + badCount);
输出:
无法编码:129 - 嗨?- 编码为:嗨?? 无法编码:141 - 嗨?- 编码为:嗨?? 无法编码:143 - 嗨?- 编码为:嗨?? 无法编码:144 - 嗨?- 编码为:嗨?? 无法编码:157 - 嗨?- 编码为:嗨?? 无法编码:193 - Hi Á - 编码为:Hi ?? 无法编码:205 - Hi Í - 编码为:Hi ?? 无法编码:207 - Hi Ï - 编码为:Hi ?? 无法编码:208 - 嗨?- 编码为:嗨?? 无法编码:221 - 嗨?- 编码为:嗨?? 坏数:10
Mac OS 10.6.2 上的 JDK 1.6.0_07
我的观察:
Latin1 对称地编码所有 254 个字符。Windows-1252 没有。三个可打印字符(193、205、207)在 Latin1 和 Windows-1252 中是相同的代码,所以我不认为会有任何问题。
谁能解释这种行为?这是JDK错误吗?
- 詹姆士