Java映射,如何将UTF-8字符串正确地放入映射?
我有一张地图,更确切地说是LinkedHashMap。 我想给它放一个字符串对象。 然后我读取这个值,看看实际存储了什么。 字符串本身具有非ascii字符(西里尔文、韩文等)。 一旦我把它放到地图上,然后阅读,这些字符就会被替换为???s。 一些代码: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
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 "