我有一个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转义码。
答案 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 "