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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我的字符集编码转换仅适用于小写字母?相关的知识,希望对你有一定的参考价值。

我已经为我的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");      
    }

由于特殊的丹麦语/挪威语字符ÆØÅ æøå,我使用这些方法。这些已经运行了一段时间了,但我刚刚发现第二种方法无法转换大写字符。发送String "ÆØÅ æøå"时,它返回"?????? æøå"。这让我很困惑,因为conversion table found here似乎声称所有六个字符都遵循相同的编码。

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

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

答案

您的encodeLatinToUTF8使用UTF-8编码将Unicode字符串转换为字节数组。然后它解码UTF-8编码的字节数组假装它是ISO-8859-1(有你的问题)并将其转换为Unicode字符串。

与其他方法相同。

你的方法有点无意义。字符串没有编码,因为它们已经被解码为字符。字符编码是一种将字符表示为8位数字的方法,因此它只在字节数组上下文中有意义。

另一答案

如果将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");
    }

如果您已经从文件/流/字节数组中读取了一个字符串但编码错误,则修复它的内容已经不可能了。

另一答案

我终于成功了。在使用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,或您正在使用的库或平台的正确字符编码名称。)

失败的三个角色是Æ ØÅ,都包括上面列表中的字符。

以上是关于为什么我的字符集编码转换仅适用于小写字母?的主要内容,如果未能解决你的问题,请参考以下文章

Java基础——字母大小写转换

re.findall带负数,我的代码仅适用于正数

前端HTML编码规范

java字符转换

2021-12-24:划分字母区间。 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 力扣763。某大厂面试

Java中关于大小写字母的转换