Java映射,如何将UTF-8字符串正确地放入映射?

Java映射,如何将UTF-8字符串正确地放入映射?,java,string,json,utf-8,map,Java,String,Json,Utf 8,Map,我有一张地图,更确切地说是LinkedHashMap。 我想给它放一个字符串对象。 然后我读取这个值,看看实际存储了什么。 字符串本身具有非ascii字符(西里尔文、韩文等)。 一旦我把它放到地图上,然后阅读,这些字符就会被替换为???s。 一些代码: Map obj = new LinkedHashMap(); System.out.println("name: " + getName()); // prints "i4niac_сим_sim" obj.put("name", getNam

我有一张地图,更确切地说是LinkedHashMap。 我想给它放一个字符串对象。 然后我读取这个值,看看实际存储了什么。 字符串本身具有非ascii字符(西里尔文、韩文等)。 一旦我把它放到地图上,然后阅读,这些字符就会被替换为???s。 一些代码:

Map obj = new LinkedHashMap();
System.out.println("name: " + getName());  // prints "i4niac_сим_sim"
obj.put("name", getName());
System.out.println("written stuff: " + obj.get("name"));  // prints i4niac_???_sim
这里有什么诀窍? 我使用这个映射使JSON对象和JSON变得简单,并将其从服务器发送到客户端

更新:

啊,抱歉弄得这么乱。 首先,我指责数据存储,然后是地图,最后,正如预期的那样,在另一个地方是我的错。 我在appengine中发送json数据,将内容类型设置为“application/json”

它只是从来没有把它作为UTF-8发送,不管我在后端尝试了哪些技巧。 改为

    resp.setCharacterEncoding("UTF-8");

我终于收到了非ascii字符的UTF-8转义码。

你怎么知道这些字符被替换成了您的控制台不是设置为ASCII代码页或类似的吗?或者您在控制台中使用的字体不能正确处理UTF-8字符?您是否尝试将所有这些内容写入一个文件,并用类似MS Word的方式打开它,并验证是否属实?

使用
-encoding
标志重新编译代码

像这样

javac -encoding UTF-8 Test3.java
Java映射,如何将UTF-8字符串正确地放入映射

字符串不可变且始终编码为UTF-16。如果要在任何其他编码中表示字符数据,必须使用字节数组

由于不会对字符串进行变异或序列化,因此输入的对象值应该是返回的值

我能想到的唯一解释是:

  • getName()
    不会每次都返回对同一字符串的引用(很可能)
  • System.out
    PrintWriter
    同时修改
  • 同时修改接收数据的控制台的编码
您可以发出十六进制形式的字符串,以确保显示错误不是问题:

public static String toCodeUnits(String s) {
  StringBuilder sb = new StringBuilder();
  for(char codeUnit : s.toCharArray()) {
    sb.append(String.format("%04x ", (int) codeUnit));
  }
  return sb.toString();
}
对于
i4niac_Сццsim
,此代码将返回:

"0069 0034 006e 0069 0061 0063 005f 0441 0438 043c 005f 0073 0069 006d "

打印结果的终端是否正确显示其他UTF-8字符串?这可能是字体问题…嗨,你可以看到我完全改变了这个问题。数据是从数据存储中正确读取的,我的错误是忽略了它。问题是使用Map时,我把UTF-8字符串放在那里,然后得到一个“丑陋”的字符串。查看编码的系统属性。我指的是来自同一个程序的System.getProperty(“file.encoding”)(JVM)。奇怪的是,我没有遇到这个问题。对于这两个输出,我得到了相同的字符串(
i4niac_Сццsim
)。在Eclipse中的Java 6和windows 7上,我得到了正确的UTF-8字符串,在控制台上,我得到了预期的丑陋字符串。。。我很好奇你用的是什么JRE/JDK?根据他的代码示例,他在将值添加到地图之前打印出值,此时显示的很好,这推翻了控制台/字体理论。
"0069 0034 006e 0069 0061 0063 005f 0441 0438 043c 005f 0073 0069 006d "