无法将“...”翻译为宽字符串

JBG*_*ber 9 encoding r

在我看来,R 在 4.3.0 版本中引入了一个新错误,这破坏了我的很多网络抓取工具。我只发现一处提到了这一变化,但不太理解这篇博文

本质上,这段代码在较新版本的 R 上失败,但较旧版本执行了一些似乎有效的内部转换:

text <- "\xa0 x"
gsub("x", "u", text)
#> Warning in gsub("x", "u", text): unable to translate '<a0> x' to a wide string
#> Error in gsub("x", "u", text): input string 1 is invalid
Run Code Online (Sandbox Code Playgroud)

创建于 2023-07-13,使用reprex v2.0.2

在进行字符串操作之前有什么方法可以删除这些特殊字符吗?请注意,我不知道哪些字符具体失败,因为我正在使用的真实字符串太长而无法检查。

小智 13

这是一个编码问题,text不会被解释为有效字符串,因为它包含非 ASCII 字符。

转换为 UTF-8:

text_utf8 <- iconv(text, from = "ISO-8859-1", to = "UTF-8")
gsub("x","u", text_utf8)
Run Code Online (Sandbox Code Playgroud)

将产生:' u'.

R 4.3.0 变更日志说:“正则表达式函数现在更彻底地检查它们的输入是否是有效的字符串(在它们的编码中,例如 UTF-8)。”

您还可以将输入视为字节序列(这也将保留在输出中)。

gsub("x", "u", text, useBytes = TRUE)
Run Code Online (Sandbox Code Playgroud)

给出'\xa0 u'