【发布时间】:2016-10-28 12:46:41
【问题描述】:
我正在尝试从 http cookie 中读取字符串序列化的 json 对象。字符串看起来像这样
"{\"status\": 400\054 \"code\": \"14040\"\054 \"links\": {\"self\": \"\"}\054 \"title\": \"Conflicting Email\"}"
所以其中有 unicode 实体,例如:\054 这只是一个逗号 ,
当我尝试将字符串转换为这样的 json 对象时
if let data = cookieValue.data(using: .ascii) {
do {
let obj = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String : AnyObject]
// print("Successfull: \(obj)")
} catch let error as NSError {
// print("Cannot convert data to json: \(data)\nError: \(error)")
}
}
它返回一个错误说:
Error: Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Invalid escape sequence around character 17.) UserInfo=0x78e586c0 {NSDebugDescription=Invalid escape sequence around character 17.}
第 17 个字符是\054 的位置。
如何将 unicode 实体转换为文本?
【问题讨论】:
-
是编码 Unicode 还是 ASCII?它们可能对相同的字符有一些共同的代码,但它们是不同的编码。
-
另外,
\054不是被解析为<null-char>54吗?像 "\" 只转义0。 -
闻起来像 JavaScript 字符串文字转义。在 JS 中,
\0可以是空字符,也可以是 1-3 位八进制转义的一部分。八进制 0o54 是十进制 44 是 ASCII 逗号。八进制转义令人困惑且无用,这就是为什么它们(实际上是空转义)不是 JSON 标准的一部分。为什么 cookie 创建代码可能决定 JS-string-literal-escape 一个已经编码的 JSON 值是神秘的,但由于没有标准方法将任意字符编码到 cookie 中,他们可能会做任何疯狂的事情。 .