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