在java映射中将非Ascii字符串用作键时未获取值

在java映射中将非Ascii字符串用作键时未获取值,java,collections,special-characters,Java,Collections,Special Characters,我有一个字符串“Montaño”,我将它用作java Map中的键。但当我试图检索该键的值时。它给出空值 你知道这里怎么了吗 编辑:我从DB获得的值显示在日志Monta中�o和用作键。但当我从其他一些参数中读取相同的名称时(也显示db中的名称),它显示为Montaño。我确信这件事是正确的�' 是尼娜。 所以,在将其设置为地图中的关键点之前,我应该做什么。这样我就可以正确地检索值您的问题出在其他地方,而不是地图上。试试这个测试 HashMap m = new HashMap();

我有一个字符串“Montaño”,我将它用作java Map中的键。但当我试图检索该键的值时。它给出空值

你知道这里怎么了吗

编辑:我从DB获得的值显示在日志Monta中�o和用作键。但当我从其他一些参数中读取相同的名称时(也显示db中的名称),它显示为Montaño。我确信这件事是正确的�' 是尼娜。
所以,在将其设置为地图中的关键点之前,我应该做什么。这样我就可以正确地检索值

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

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

Montaño
我试过了

String val = "Montaño";

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

System.out.println(map.get(val));
所以可能的问题是您试图获取元素的字符串。检查两个字符串是否相同。

替换字符� 你从数据库中得到的不是ñ,而是一种特殊的字符,用来表示无法正确解码的字符。您应该修复数据库,使其始终返回Montaño


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

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

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

 useUnicode=true;characterEncoding=UTF-8

这显然是一个编码问题

ñ
字符以2个字节表示:
c3b1
。例如,在中,它用单个字节
F1
表示。事实上你看到的是一个
字符似乎表示您正在UTF-8中解释
F1
。如果您将
c3b1
字节解释为ISO-8859,您将看到
ñ

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


,(即Windows的Windows-1252,GNU/Linux的UTF-8)。检查数据库编码是否兼容,或者为JVM指定一个兼容的编码(UTF始终是避免此类问题的一个很好的选择)。

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

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


谢谢大家的关心。您的建议为我提供了一些很好的方法,我将在这方面做这些工作。

您能给我们看一下代码吗,因为它对我来说很好……好吧,当相同的记录以相同的字符显示在浏览器上时。它显示为ñ。所以,我不认为这是个问题。但我一定会查一查。谢谢
 useUnicode=true;characterEncoding=UTF-8