不确定这个问题是否已经得到了答复,但是快速搜索并没有得到令人满意的结果。
我被困在下面的场景中:
we服务由一家德国公司运行,因此结果数据中的一些字符串包含特殊字符,如德语umlauts:
// example resonse
[
{
"title" : "reward 1",
"description" : "Ein gro\u00dfer Kaffee f\u00fcr dich!"
},
{
"title" : "reward 2",
"description" : "Eine Pizza f\u00fcr dich!"
},
...
]在本地,应用程序使用一组反映响应对象的类来解析数据(例如,奖励类和RewardResponse类,用于上面的示例)。这些类中的每一个都可以从/转到JSON中读取和转储自己--但是这是事情变得糟糕的地方。
以上面的例子为例,org.json将正确地解析数据,产生的字符串将包含特殊字符‘’(\u00df)和'ü‘(\u00fc)的适当的Unicode版本。
final RewardResponse response = new RewardResponse(jsonData);
final Reward reward = response.get(0);
// this will print "Ein großer Kaffee für dich!"
Log.d("dump server data", reward.getDescription());
final Reward reward2 = new Reward(reward.toJSON());
// this will print "Ein gro�er Kaffee f�r dich!"
Log.d("dump reloaded data", reward2.getDescription());如您所见,加载由JSONObject.toString()生成的数据存在问题。
主要发生的事情是,JSONObject将以"\uXXXX“的形式解析转义,但它会将它们转储为普通的UTF-8文本。
反过来,在解析时,它将不正确地读取unicode,而是在结果字符串中插入一个替换字符(�上面的\uffff作为代码点)。
我目前的解决方案包括一个查找表,其中包含Unicode Latin1补充字符及其各自的转义版本(\u00a0至\u00ff)。但这也意味着,每次抛出JSON文本时,我都必须检查每一个JSON文本,并在每次转储时用它们的转义版本替换字符。
,请告诉我,有更好的方法!
(注意:有this question,但是他在磁盘上的本地文件编码方面有问题。)
我上面的问题,如你所见,是可以复制的,不需要写到磁盘上)
编辑:,如注释中所请求的,下面是toJSON()方法:
public final String toJSON() {
JSONObject obj = new JSONObject();
// mTitle and mDescription contain the unmodified
// strings received from parsing.
obj.put("title", mTitle);
obj.put("description", mDescription);
return obj.toString();
}顺便提一句,如果我使用JSONObject.toString()或JSONStringer,这并没有什么区别。(文档建议使用.toString())
编辑:只是为了从等式中删除奖励,这重复了问题:
final JSONObject inputData = new JSONObject("{\"description\":\"Ein gro\\u00dfer Kaffee\"}");
final JSONObject parsedData = new JSONObject(inputData.toString());
Log.d("inputData", inputData.getString("description"));
Log.d("parsedData", parsedData.getString("description"));发布于 2013-01-11 13:16:11
注意:张贴是为了更好的格式化
我刚试过这个例子
final JSONObject inputData = new JSONObject("{\"description\":\"Ein gro\\u00dfer Kaffee\"}");
final JSONObject parsedData = new JSONObject(inputData.toString());
Log.d("inputData", inputData.getString("description"));
Log.d("parsedData", parsedData.getString("description"));在我的Nexus 7上运行Android 4.2.1,在Nexus S上运行4.1.2,它的工作原理如下:
D/inputData(17281): Ein großer Kaffee
D/parsedData(17281): Ein großer Kaffee你在哪个Android版本中看到了这个问题?
https://stackoverflow.com/questions/14274303
复制相似问题