环境:
iOS客户端,VS2010下编写的服务端,数据库SQL2005
json库:http://stig.github.com/json-framework
json解析时,遇到一些控制码将会出错,造成数据解析失败。之前测试过了客户端提交的数据和服务端获得的数据(存入数据库前)一致,因此编码转换并没有出错,因此编码不一致的问题排除。
网上查到过滤的仅是\b, \t, \n, \f, \r, \\, \'', /, 普遍的做法为:
View Code
1 static StringBuffer string2Json(String s) { 2 StringBuffer sb = new StringBuffer (); 3 for (int i=0; i) { 4 5 char c = s.charAt(i); 6 switch (c) { 7 case '\"': 8 sb.append("\\\""); 9 break; 10 case '\\': 11 sb.append("\\\\"); 12 break; 13 case '/': 14 sb.append("\\/"); 15 break; 16 case '\b': 17 sb.append("\\b"); 18 break; 19 case '\f': 20 sb.append("\\f"); 21 break; 22 case '\n': 23 sb.append("\\n"); 24 break; 25 case '\r': 26 sb.append("\\r"); 27 break; 28 case '\t': 29 sb.append("\\t"); 30 break; 31 default: 32 sb.append(c); 33 } 34 return sb.toString(); 35 }
对于上述控制符,该库中已经做了过滤。
最终,在实际的数据传递(以UTF-8编码传递,因为ios中默认为UTF-8)中,会发现一些内容里存在另外一些控制符。
例如:
utf-8下,hex为0x14,source code为“\u0014”的字符,这个字符的name为DEVICE CONTROL FOUR。关于这个字符的详细介绍请点这里,另一些控制符列表可看这里。
我们用的这个第三方库并不能过滤如上所说的控制符。
解决:
在服务端替换了一个json库(json.net),新的json库将内容中的控制符都过滤掉了,貌似在JsonTextReader里有相应的过滤源码,不过还没深入看,并不确定,有空在仁兄可以抽出来剖析剖析。