2011-05-13 68 views
3

我有一个Map,LinkedHashMap更准确。 我想把一个字符串对象给它。 然后我读取这个值来查看实际存储的内容。 该字符串本身具有非ASCII字符(西里尔文,韩文等)。 一旦我把它放到地图然后阅读,这些字符被替换为???。 部分代码:爪哇地图,如何正确地把UTF-8字符串放到地图上?

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 Engine中设置内容类型发送JSON数据作为“应用/ 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转义码。

+0

请在您正确打印结果显示其他UTF-8字符串的终端?这可能是一个字体问题... – 2011-05-13 14:50:23

+0

嗨,你可以看到我已经完全改变了这个问题。 从数据存储区正确读取数据,我的错误忽略了它。问题在于使用Map,我把UTF-8字符串放在那里,然后变得“丑陋”。 – i4niac 2011-05-13 15:11:56

+0

查看编码的系统属性。我的意思是来自同一个程序的System.getProperty(“file.encoding”)(JVM)。 – ssedano 2011-05-13 15:14:21

回答

0

你怎么知道字符被替换??? - 是不是您的控制台设置为ASCII代码页或类似的情况?或者不是你在控制台中使用的字体不能正确处理UTF-8字符?你有没有试图将所有这些文件写入一个文件,并打开它像MS Word一样,并验证是否是这种情况?

+0

根据他的代码示例,他将值添加到地图之前将其打印出来,并且在该点反映控制台/字体理论时显示得很好。 – 2011-05-13 15:22:22

0

重新编译代码-encoding标志

这样

javac -encoding UTF-8 Test3.java 
0

Java的地图,如何正确地把UTF-8字符串的地图?

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

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

我能想到的唯一解释:

  • getName()不参照每
  • System.outPrintWriter被同时修改
  • 的编码时间(最有可能)返回到相同的字符串接收数据的控制台被同时修改

您可以将字符串的十六进制格式发送到en确保显示的bug都没有问题:

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 "