为什么我的字符集编码转换仅适用于小写字母?

时间:2018-03-02 11:12:57

标签: java utf-8 character-encoding iso-8859-1

我已经为我的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似乎声称所有六个字符都遵循相同的编码。

有谁知道为什么我的大写字符在这里没有正确转换?

更新 从提供的答案中,我可以看出我在关于字符集和编码方面的知识存在一些严重的差距。我想我必须回到基础,阅读更多,然后我会决定这个问题后来是否可以挽救。

3 个答案:

答案 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,或库的正确字符编码名称或   你正在使用的平台。)

失败的三个字符是Æ ØÅ,所有字符都包含上面列表中的字符。