不确定是否已经回答了这个问题,但是快速搜索并没有得到令人满意的结果。
我遇到了以下情况:
- 具有 REST API 和 JSON 格式数据块的 Web 服务
- android 客户端应用程序与此服务通信并在本地缓存/处理数据
we 服务由一家德国公司运营,因此结果数据中的某些字符串包含特殊字符,例如德语变音符号:
// example resonse
[
{
"title" : "reward 1",
"description" : "Ein gro\u00dfer Kaffee f\u00fcr dich!"
},
{
"title" : "reward 2",
"description" : "Eine Pizza f\u00fcr dich!"
},
...
]
在本地,应用程序使用一组反映响应对象的类(例如,上例的Reward和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 文本,并在每次转储某些内容时用转义版本替换字符。
请告诉我有更好的方法!
(注意:有这个问题,但是他在磁盘上的本地文件编码有问题。
如您所见,我上面的问题是可以重现的,而无需写入磁盘)
编辑:根据评论中的要求,这里是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"));