在我看来,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'