Java Map,如何正确地将UTF-8字符串放到地图上?

时间:2011-05-13 14:34:19

标签: java string json utf-8 map

我有一个Map,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-simple创建JSON对象,并将它从服务器发送到客户端。

更新

呃,抱歉所有的烂摊子。 首先,我责备数据存储,然后映射,最后,正如预期的那样,这是我在另一个地方的错。 我将app引擎设置内容类型中的json数据发送为“application / json”

public void doPost(HttpServletRequest req, HttpServletResponse resp) {
// ...
        resp.setContentType("application/json");
        resp.getWriter().println(jsonObj.toString());
}

它从未发送过它作为UTF-8,无论我在后端尝试了哪些技巧。 更改为

    resp.setCharacterEncoding("UTF-8");

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

使用-encoding标志

重新编译代码 像这样

javac -encoding UTF-8 Test3.java

答案 2 :(得分:0)

  

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

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

由于LinkedHashMap不会改变或序列化字符串,因此您输入的对象值应该是返回的值。

我能想到的唯一解释:

  • 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 "