我已经为我的Web应用程序做了一些工作,因为我在第一次创建时没有在所有范围内将字符编码设置为UTF-8。我做了一个简单的字符转换java类,这样我就可以在需要的地方插入字符编码转换。这些是我的方法:
public static String encodeUTF8ToLatin(String s) throws UnsupportedEncodingException {
byte[] b = s.getBytes("UTF-8");
return new String(b, "ISO-8859-1");
}
public static String encodeLatinToUTF8(String s) throws UnsupportedEncodingException {
byte[] b = s.getBytes("ISO-8859-1");
return new String(b, "UTF-8");
}
由于特殊的丹麦语/挪威语ÆØÅ æøå
,我正在使用这些方法。这些已经运行了一段时间了,但我刚刚发现第二种方法无法转换大写字符。发送字符串"ÆØÅ æøå"
时,它返回"?????? æøå"
。这让我很困惑,因为conversion table found here似乎声称所有六个字符都遵循相同的编码。
有谁知道为什么我的大写字符在这里没有正确转换?
更新 从提供的答案中,我可以看出我在关于字符集和编码方面的知识存在一些严重的差距。我想我必须回到基础,阅读更多,然后我会决定这个问题后来是否可以挽救。
答案 0 :(得分:1)
您的encodeLatinToUTF8使用UTF-8编码将Unicode字符串转换为字节数组。然后它解码UTF-8编码的字节数组假装它是ISO-8859-1(有你的问题)并将其转换为Unicode字符串。
与其他方法相同。
你的方法有点无意义。字符串没有编码,因为它们已经被解码为字符。字符编码是一种将字符表示为8位数字的方法,因此它只在字节数组上下文中有意义。
答案 1 :(得分:-1)
如果将String作为输入/输出,则无法进行任何转换。进行转换需要以下内容:
public static byte[] encodeLatinToUTF8(byte[] b) throws UnsupportedEncodingException {
return new String(b, "ISO-8859-1").getBytes();
}
public static String encodeLatinToUTF8(String s) throws UnsupportedEncodingException {
return new String(b, "UTF-8").getBytes("ISO-8859-1");
}
如果您已经从文件/流/字节数组中读取了一个字符串但编码错误,则修复它的内容已经不可能了。
答案 2 :(得分:-1)
我终于成功了。在使用UTF-8创建新字符串之前,我只是使用“Windows-1252”而不是“ISO-8859-1”来获取字节。
我创建了一个新方法,适用于小写和大写字母:
public static String encodeWindows1252ToUTF8(String s) throws UnsupportedEncodingException {
byte[] b = s.getBytes("Windows-1252");
return new String(b, "UTF-8");
}
我通过引用this page找到了这个答案,其中指出:
症状以下字符失败,同时显示其他字符 正确地:
€,ƒ“...†‡‰Š
œžŸ。 商标和欧元货币符号,省略号,单号和双号 “智能引号”,en和em破折号以及OE结扎字符 经常使用,最有可能被报告为症状 这个问题。
解释 0x80-0x9F(128-159)范围内的字符... Windows-1252而不是ISO-8859-1。如果你有问题 仅在该范围内的字符,这是因为字符是 被视为ISO-8859-1而不是Windows-1252。
查找对ISO-8859-1的引用并将其替换为“Windows-1252” (或CP1252,或库的正确字符编码名称或 你正在使用的平台。)
失败的三个字符是Æ
Ø
和Ã…
,所有字符都包含上面列表中的字符。