在RJSONIO
中存在一个长期以来的错误,用于解析包含Unicode转义序列的JSON字符串。似乎需要在libjson
中修复此错误,但这可能不会很快发生,因此我正在寻找在R中创建解除转义\uxxxx
序列的解决方法,然后再将其提供给json解析器。
一些背景:JSON数据始终是Unicode格式,默认情况下使用utf-8
,因此通常不需要进行转义。但由于历史原因,JSON确实支持转义的Unicode。因此,JSON数据
{"x" : "Zürich"}
和
{"x" : "Z\u00FCrich"}
这两种写法等价,解析时应该得到完全相同的输出。但由于某些原因,RJSONIO
中后一种写法无效。此外,R 本身也支持转义 Unicode。因此,当我们在 R 控制台输入 "Z\u00FCrich"
时,它会自动正确转换为 "Zürich"
,导致进一步的 混淆。要获取实际的 JSON 字符串,我们需要转义 json 中 unicode 转义序列的第一个字符——反斜杠本身:
test <- '{"x" : "Z\\u00FCrich"}'
cat(test)
我的问题是:在R语言中,如何处理一个大的json字符串,将所有转义的unicode序列还原?即如何将所有\uxxxx
的出现替换为相应的unicode字符?这里的\uxxxx
表示一个由6个字符组成的实际字符串,以反斜杠开头。因此,一个unescape
函数应该满足以下条件:
#Escaped string
escaped <- "Z\\u00FCrich"
#Unescape unicode
unescape(escaped) == "Zürich"
#This is the same thing
unescape(escaped) == "Z\u00FCrich"
有一件事可能会使事情变得复杂,那就是如果反斜杠本身在json中用另一个反斜杠转义,则它不是Unicode转义序列的一部分。例如,unescape
也应该满足:
#Watch out for escaped backslashes
unescape("Z\\\\u00FCrich") == "Z\\\\u00FCrich"
unescape("Z\\\\\\u00FCrich") == "Z\\\\ürich"