如何识别/删除R中的非UTF-8字符

Mar*_*ing 22 r utf-8 stata

当我在R中导入Stata数据集(使用外部包)时,导入有时包含无效的UTF-8字符.这本身就令人不愉快,但是一旦我尝试将对象转换为JSON(使用rjson包),它就会破坏所有内容.

您是否有想法,如何识别字符串中的无效UTF-8字符并在此之后将其删除?

ags*_*udy 21

另一个解决方案使用iconv和它的参数sub:字符串.如果不是NA(这里我将其设置为''),它用于替换输入中的任何不可转换字节.

x <- "fa\xE7ile"
Encoding(x) <- "UTF-8"
iconv(x, "UTF-8", "UTF-8",sub='') ## replace any non UTF-8 by ''
"faile"
Run Code Online (Sandbox Code Playgroud)

请注意,如果我们选择正确的编码:

x <- "fa\xE7ile"
Encoding(x) <- "latin1"
xx <- iconv(x, "latin1", "UTF-8",sub='')
facile
Run Code Online (Sandbox Code Playgroud)


con*_*mac 10

Yihui 的xfun包有一个函数 ,read_utf8它尝试读取文件并假设它编码为 UTF-8。如果文件包含非 UTF-8 行,则会触发警告,让您知道哪些行包含非 UTF-8 字符。在底层,它使用一个非导出函数xfun:::invalid_utf8(),如下所示:which(!is.na(x) & is.na(iconv(x, "UTF-8", "UTF-8")))

\n\n

检测字符串中特定的非 UTF-8 单词,您可以稍微修改上面的内容并执行以下操作:

\n\n
invalid_utf8_ <- function(x){\n\n  !is.na(x) & is.na(iconv(x, "UTF-8", "UTF-8"))\n\n}\n\ndetect_invalid_utf8 <- function(string, seperator){\n\n  stringSplit <- unlist(strsplit(string, seperator))\n\n  invalidIndex <- unlist(lapply(stringSplit, invalid_utf8_))\n\n  data.frame(\n    word = stringSplit[invalidIndex],\n    stringIndex = which(invalidIndex == TRUE)\n  )\n\n}\n\nx <- "This is a string fa\\xE7ile blah blah blah fa\\xE7ade"\n\ndetect_invalid_utf8(x, " ")\n\n#     word stringIndex\n# 1 fa\xc3\xa7ile    5\n# 2 fa\xc3\xa7ade    9\n
Run Code Online (Sandbox Code Playgroud)\n