当前位置: 首页 > 面试题库 >

字符串中的转义unicode

饶承宣
2023-03-14
问题内容

在解析包含unicode转义序列的json字符串时,存在一个长期存在的错误RJSONIO。似乎需要修复该错误,这种错误libjson可能很快就不会发生,因此我正在寻找一种在R中创建解决方法的方法,该方法在将\uxxxx序列提供给json解析器之前先取消序列化。

一些上下文:json数据始终是unicode,utf-8默认情况下使用,因此通常不需要转义。但是出于历史原因,json确实支持转义的unicode。因此json数据

{"x" : "Zürich"}

{"x" : "Z\u00FCrich"}

是等效的,并且在解析时应产生完全相同的输出。但是无论出于什么原因,后者都不起作用RJSONIO。R本身也支持转义的unicode,这引起了进一步的混乱。因此,当我们输入"Z\u00FCrich"R控制台时,它会自动正确转换为"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"

问题答案:

在玩了更多之后,我认为我能做的最好的就是\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
}

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



 类似资料:
  • 问题内容: 为了回答这个问题,我设法通过转义反斜杠来使字符串成为转义字符。 当我尝试将其概括为转义所有转义的字符时,它似乎无能为力: 但是对于特定的转义字符使用相同的方法,它确实起作用: 有一般的方法可以做到这一点吗?应包括,,,等。 问题答案: 使用r’text’将字符串定义为raw,如下面的代码所示:

  • 在普通字符串中,我可以用反斜杠转义: 在字符串文字中有可能做同样的事情吗?反斜杠不再是转义字符: 到目前为止,我看到的唯一解决方案是字符串连接,这非常难看,以及嵌套插值,这开始变得有点可笑:

  • 本文章将介绍Thymeleaf标准表达式语法中的概念。 学习如何在Thymeleaf模板中显示转义值。 已将HTML代码片段设置为上下文模型,并将其作为变量名为的字符串。在第一个div中显示HTML转义字符串,在第二个中显示未转义字符串。 如果要上机实践,请参考:Thymeleaf+SpringMVC5示例项目。这里不再重复创建项目的过程,这里将只介绍如何使用标准表达式和标签。 这里创建一个Mav

  • 问题内容: JavaScript是否具有诸如PHP的(或)函数之类的内置函数,以向需要转义字符串的字符添加反斜杠? 例如,这: 这是一个带有“单引号”和“双引号”的演示字符串。 …会成为: 这是一个带有'单引号'和\“双引号\”的演示字符串。 问题答案:

  • 我想转动这根绳子: 到这个里面 用似乎没有明显的方法来做到这一点? 更准确地说,我想将反斜杠的转义改为转义字符。