gpt4 book ai didi

regex - 取消转义字符串中的 unicode

转载 作者:行者123 更新时间:2023-12-04 07:37:44 25 4
gpt4 key购买 nike

有一个长期存在的bugRJSONIO用于解析包含 unicode 转义序列的 json 字符串。似乎该错误需要在 libjson 中修复这可能不会很快发生,所以我正在寻找在 R 中创建一个解决方法,它可以转义 \uxxxx序列,然后将它们提供给 json 解析器。

一些上下文:json 数据总是 unicode,使用 utf-8默认情况下,所以一般不需要转义。但由于历史原因,json 确实支持转义的 unicode。因此json数据

{"x" : "Zürich"}


{"x" : "Z\u00FCrich"}

是等效的,并且在解析时应该产生完全相同的输出。但无论出于何种原因,后者在 RJSONIO 中不起作用.附加 confusion是因为 R 本身也支持转义的 unicode。所以当我们输入 "Z\u00FCrich"在 R 控制台中,它会自动正确转换为 "Zürich" .要获得实际的 json 字符串,我们需要转义反斜杠本身,它是 json 中 unicode 转义序列的第一个字符:
test <- '{"x" : "Z\\u00FCrich"}'
cat(test)

所以我的问题是:在 R 中给定一个大的 json 字符串,我怎样才能对所有转义的 unicode 序列进行转义? IE。如何替换所有出现的 \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"

最佳答案

在玩了更多之后,我认为我能做的最好的事情就是搜索 \uxxxx使用正则表达式解析模式,然后使用 R 解析器解析这些模式:

unescape_unicode <- function(x){
#single string only
stopifnot(is.character(x) && length(x) == 1)

#find matches
m <- gregexpr("(\\\\)+u[0-9a-z]{4}", x, ignore.case = TRUE)

if(m[[1]][1] > -1){
#parse matches
p <- vapply(regmatches(x, m)[[1]], function(txt){
gsub("\\", "\\\\", parse(text=paste0('"', txt, '"'))[[1]], fixed = TRUE, useBytes = TRUE)
}, character(1), USE.NAMES = FALSE)

#substitute parsed into original
regmatches(x, m) <- list(p)
}

x
}

这似乎适用于所有情况,我还没有发现任何奇怪的副作用

关于regex - 取消转义字符串中的 unicode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24952174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com