Java 中的 ISO-8859-1 到 UTF-8 (runescape API)

ISO-8859-1 to UTF-8 in Java (runescape API)

我正在尝试制作一个 Discord 机器人,它从 Runescape API 和 returns 获取有关用户的信息。我遇到的问题是当用户名涉及 space 时。

runescape api 给出了一个 ISO-8859-1 格式的文件,我尝试将其转换为 UTF-8

文件中的 2 个示例:lil Jimmy 和 lil jessica。 该循环找到了 jessica 的匹配项,但没有找到 jimmy 的匹配项。

获取和读取文件的代码:

    InputStream input = null;
    InputStreamReader inputReader = null;
    BufferedReader reader = null;

        URL url = new URL("http://services.runescape.com/m=clan-hiscores/members_lite.ws?clanName=uh");
        input = url.openConnection().getInputStream();            
        inputReader = new InputStreamReader(input, "ISO-8859-1");
        reader = new BufferedReader(inputReader);
        String line;
        while ((line = reader.readLine()) != null) {                
        String[] parts = line.split(",");
        parts[0] = new String(parts[0].getBytes("UTF-8"), "ISO-8859-1");

            if (parts[0].equals("lil Jimmy")) {System.out.println("lil Jimmy found");}  
            if (parts[0].equals("lil jessica")) {System.out.println("lil jessica found");}

有谁知道我做错了什么?预先感谢您抽出宝贵时间提供帮助!

编辑 1:我已将 "ISO-8859-1" 添加到 inputReader,如答案所示。现在下一步是用普通白色 space 替换非环绕白色 space。

编辑2:不破白space可以通过以下方式解决:

       parts[0] = parts[0].replaceAll("\u00a0","aaaaaaaaa");
       parts[0] = parts[0].replaceAll("\u00C2","bbbbbbbbb");
       parts[0] = parts[0].replaceAll("bbbbbbbbbaaaaaaaaa", " ");

aaaaaa 将不间断的 space 替换为常规的,aaaaa 删除了它放在白色 space.

前面的罗马字母 a (Â)

感谢大家的帮助!

如果您想确保正确读取数据,请使用:

inputReader = InputStreamReader(input, "ISO-8859-1");

在那之后,我不确定您为什么要尝试转换为 UTF-8,因为从那时起您只是将文本用作 Strings。字符串本身没有编码。 (好吧,在某种意义上,Java 字符串在其内部表示中类似于 UTF-16,但这是完全不同的蠕虫病毒,您在这里无需担心。)

首先,您没有在您的 InputStreamReader 中提供字符集,这导致它使用默认字符集而不是它应该使用的字符集,然后您正在做一些疯狂的事情来尝试修复您不应该使用的字符集去做,那将无法正常工作。

此外,您没有关闭打开的流,您应该使用 try-with-resources。

它应该看起来更像这样:

URL url = new URL("http://services.runescape.com/m=clan-hiscores/members_lite.ws?clanName=uh");         
try(BufferedReader inputReader = new BufferedReader(new InputStreamReader(url.openConnection().getInputStream(), StandardCharsets.ISO_8859_1))) {
    String line;
    while ((line = reader.readLine()) != null) {                
        String[] parts = line.split(",");
        if (parts[0].equals("lil Jimmy")) {System.out.println("lil Jimmy found");}  
        if (parts[0].equals("lil jessica")) {System.out.println("lil jessica found");}
    }
}

查看下载的文本文件: "lil jessica" 的白色 space 是常规的 space (U+0020),"lil Jimmy" 的白色 space 是 non-breaking space (U+00A0).

如果您不关心中断或 non-breaking,最简单的方法可能是在您的输入字符串中将其替换为普通的白色 space。类似于:

parts[0] = new String(parts[0].getBytes("UTF-8"), "ISO-8859-1");
parts[0] = parts[0].replaceAll("\u00a0"," ");
if (parts[0].equals("lil Jimmy")) {System.out.println("lil Jimmy found");}