【问题标题】:same strings, different charset, not equals相同的字符串,不同的字符集,不等于
【发布时间】:2012-09-11 13:58:04
【问题描述】:

我有一个奇怪的问题。

我有一个抓取网页以获取姓名列表的应用程序。然后将该列表传递给另一个应用程序,该应用程序使用这些名称,使用其 API 向站点请求信息。

当我将第一个网页中的某些字符串与 API 抓取的其他字符串进行比较时,通常会得到错误的结果。

我试图逐个字母地获取字符值我得到了这个:

Rocco De Nicola
82 111 99 99 111 160 68 101 32 78 105 99 111 108 97 1st web page
82 111 99 99 111 32 68 101 32 78 105 99 111 108 97 2nd

如您所见,在第一个字符串中,空格被编码为 160(不间断空格)而不是 32。

我可以正确编码第一组字符串吗?

我也尝试将字符集设置为 UTF-8,但没有成功。

也许我只需要将 160 替换为 32 ?

【问题讨论】:

    标签: java string ascii


    【解决方案1】:

    我首先会修剪并替换字符串中的复杂字符以进行比较。在这一步之后是equals调用。如果您的文本中有特定语言的替换,这也带来了优势。将生成的字符串转换为小写也是一个好主意。

    通常我使用类似的东西....

    private String removeExtraCharsAndToLower(String str) {
        str=str.toLowerCase();
        str=str.replaceAll("ä", "ae");
        str=str.replaceAll("ö", "oe");
        str=str.replaceAll("ü", "ue");
        str=str.replaceAll("ß", "ss");
        return str.toLowerCase().replaceAll("[^a-z]","");
    }
    

    【讨论】:

      【解决方案2】:

      使用蛮力。这列出了在编码时将 160 转换为 32 的所有字符集。

      String s = "" + (char) 160;
      for (Map.Entry<String, Charset> stringCharsetEntry : Charset.availableCharsets().entrySet()) {
          try {
              ByteBuffer bytes = stringCharsetEntry.getValue().encode(s);
              if (bytes.get(0) == 32)
                  System.out.println(stringCharsetEntry.getKey());
          } catch (Exception ignored) {
          }
      }
      

      什么都不打印。

      如果我将条件更改为

      if (bytes.get(0) != (byte) 160)
          System.out.println(stringCharsetEntry.getKey()+" "+new String(bytes.array(), 0));
      

      我有很多例子。

      【讨论】:

        猜你喜欢
        • 2014-05-11
        • 1970-01-01
        • 2014-07-15
        • 2015-01-31
        • 2012-09-06
        • 1970-01-01
        • 2020-12-10
        • 2015-05-24
        • 1970-01-01
        相关资源
        最近更新 更多