代码之家  ›  专栏  ›  技术社区  ›  Michael

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

  •  0
  • Michael  · 技术社区  · 7 年前

    我正在尝试创建一个Discord bot,它从Runescape API获取信息并返回有关用户的信息。我遇到的问题是用户名是否包含空格。

    runescape api提供了一个ISO-8859-1中的文件,我尝试将其转换为UTF-8

    文件中的两个示例: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。现在,下一步是用常规whit空格替换非换行空格。

    编辑2:非中断空格可通过以下方式解决:

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

    aaaaaa将不间断空格替换为常规空格,aaaaa删除了它放置在空格前面的罗马字母a()。

    谢谢大家帮助我!

    3 回复  |  直到 7 年前
        1
  •  1
  •   kshetline    7 年前

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

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

    在那之后,我不知道您为什么要尝试转换为UTF-8,因为您只是将文本用作 String 从那一点开始。字符串本身没有编码。(从某种意义上讲,Java字符串在其内部表示形式上类似于UTF-16,但这是一整罐蠕虫,您在这里不必担心。)

        2
  •  1
  •   Nyamiou The Galeanthrope    7 年前

    首先,您没有在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");}
        }
    }
    
        3
  •  0
  •   Marvin    7 年前

    查看下载的文本文件: “lil jessica”的空格是一个常规空格(U+0020),“lil Jimmy”的空格(以及大多数其他空格)是一个不间断空格(U+00A0)。

    如果您不喜欢断开或不断开,最简单的方法可能是在输入字符串中用常规的空格替换它。类似于:

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