在Java地图中使用非Ascii字符串作为键时没有任何价值

时间:2013-07-12 07:17:29

标签: java collections special-characters

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

任何想法在这里有什么问题?

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

7 个答案:

答案 0 :(得分:2)

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

问题可能在于您如何连接到数据库,而不是单个记录。您可能需要在连接字符串中设置连接的编码,或者在获取连接后在连接上设置属性。您没有说明您使用的是哪个数据库,因此我无法更详细,请查看数据库手册以了解连接选项。

答案 1 :(得分:0)

你的问题出在其他地方,而不是Map。试试这个测试

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

输出

Montaño

答案 2 :(得分:0)

我试过

String val = "Montaño";

Map<String, String> map = new HashMap<String, String>();
map.put(val, "test");

System.out.println(map.get(val));

根据需要输出:

test

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

答案 3 :(得分:0)

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

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

 useUnicode=true;characterEncoding=UTF-8

答案 4 :(得分:0)

这显然是编码问题。

ñ字符在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为Windows-1252,GNU / Linux为UTF-8)。检查您的数据库编码是否兼容,或为您的JVM指定兼容的(UTF始终是避免这类问题的好选择)。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

由于我无法访问Server,因此无法访问数据库。 我得到的记录不是直接来自数据库。我通过java API获取所有记录。 所以,我最终做了一个解决方法,使用该Object的实例(表示记录)作为映射Key,而不是使用name作为Key。这样我的问题就解决了。

谢谢大家的关注。你的建议给了我一些很好的方法,我将在最后完成。