【问题标题】:getting no value while using non-Ascii string as key in java map在 java map 中使用非 Ascii 字符串作为键时没有得到任何值
【发布时间】:2013-07-10 16:15:04
【问题描述】:

我有一个字符串'Montaño',我将它用作java Map 中的键。但是当我试图检索这个键的值时。它给出了 null。

知道这里有什么问题吗?

已编辑:我从 DB 获得的值显示在 Monta�o 日志中,并用作 Key。但是,当我从其他一些参数(也显示来自 db 的名称)中读取相同的名称时,它显示为 Montaño。我确信'�'是ñ。 那么,在将其设置为 map 中的键之前我应该​​做什么。这样我就可以正确检索值

【问题讨论】:

  • 你能给我们看看代码吗,因为它对我来说很好用...

标签: java collections special-characters


【解决方案1】:

由于我无权访问服务器,也无权访问数据库。 我得到的记录不是直接来自数据库。我正在通过 java API 获取所有记录。 所以,我终于做了一个解决方法,使用该对象的实例(表示记录)作为映射键,而不是使用名称作为键。这样我的问题就解决了。

感谢大家的关心。你的建议给了我一些好方法,我会在我的最后做。

【讨论】:

    【解决方案2】:

    这显然是一个编码问题。

    ñ 字符以 UTF-8 表示,有 2 个字节:C3 B1。例如,在ISO-8859-1 中,它用单个字节F1 表示。您看到 字符的事实似乎表明您正在用UTF-8 解释F1。如果您将 C3 B1 字节解释为 ISO-8859,您会看到 ñ

    如果您确定该值已正确存储在数据库中,请确保您的 JVM 使用兼容的编码(例如,ISO-8859-1)。

    The JVM will use by default the platform's encoding,(即 Windows-1252 用于 Windows,UTF-8 用于 GNU/Linux)。检查您的 DB 编码是否兼容,或为您的 JVM 指定一个兼容的编码(UTF 始终是避免此类问题的好选择)。

    【讨论】:

      【解决方案3】:

      您从数据库中获取的“替换字符”不是 ñ,它是一个特殊字符,用于表示无法正确解码的字符。您应该修复您的数据库,使其始终返回 Montaño。

      问题可能在于您连接到数据库的方式,而不是单个记录。您可能需要在连接字符串中设置连接的编码,或者在获取连接后设置连接的属性。你没有说你使用哪个数据库,所以我不能更详细,查看你的数据库的手册以获取连接选项。

      【讨论】:

      • 好吧,当相同的记录以相同的字符显示在浏览器上时。它显示为ñ。所以,我不认为这可能是问题。但我一定会检查的。谢谢
      【解决方案4】:

      我认为您的数据库已正确编码。尝试在 JVM 启动时传递 -Dfile.encoding=UTF-8。如果它是一个独立程序,请像 java -Dfile.encoding=UTF-8 … com.packages.YourMainClass 一样传递它。如果它是一个 Web 应用程序,请将其添加到您的服务器启动脚本中。

      【讨论】:

        【解决方案5】:

        确保您的表格列接受特定的字符编码,例如 UTF-8。

        使用以下标志连接到数据库:

         useUnicode=true;characterEncoding=UTF-8
        

        【讨论】:

          【解决方案6】:

          我试过了

          String val = "Montaño";
          
          Map<String, String> map = new HashMap<String, String>();
          map.put(val, "test");
          
          System.out.println(map.get(val));
          

          根据需要输出:

          test
          

          因此,您尝试获取元素的字符串可能存在问题。检查两个字符串是否相同。

          【讨论】:

            【解决方案7】:

            您的问题出在其他地方,而不是在地图上。试试这个测试

                HashMap m = new HashMap();
                m.put("Montaño", "Montaño");
                System.out.println(m.get("Montaño"));
            

            输出

            Montaño
            

            【讨论】:

              猜你喜欢
              • 2013-09-08
              • 2013-04-06
              • 2021-10-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-05-30
              • 2015-09-04
              • 1970-01-01
              相关资源
              最近更新 更多