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

时间:2013-06-25 07:13:42

标签: r utf-8 stata

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

您是否知道如何识别字符串中的无效UTF-8字符并在之后将其删除?

4 个答案:

答案 0 :(得分:15)

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

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

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

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

答案 1 :(得分:2)

在整个数据集上使用dplyr删除不良字符的另一种方法:

library(dplyr)

MyDate %>%
    mutate_at(vars(MyTextVar1, MyTextVar2), function(x){gsub('[^ -~]', '', x)})

其中MyDataMyTextVar是数据集和要从中删除不良苹果的文本变量。这可能不如更改编码健壮,但通常可以轻松删除它们。

答案 2 :(得分:1)

您可以尝试使用iconv将其转换为UTF-8字符串,而不是删除它们。

require(foreign)
dat <- read.dta("data.dta")

for (j in seq_len(ncol(dat))) {
   if (class(dat[, j]) == "factor")
       levels(dat[, j]) <- iconv(levels(dat[, j]), from = "latin1", to = "UTF-8")
}

在您的情况下,您可以使用更合适的enconding替换latin1。 由于我们无法访问您的数据,因此很难知道哪一种更适合。

答案 3 :(得分:0)

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")))

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

invalid_utf8_ <- function(x){

  !is.na(x) & is.na(iconv(x, "UTF-8", "UTF-8"))

}

detect_invalid_utf8 <- function(string, seperator){

  stringSplit <- unlist(strsplit(string, seperator))

  invalidIndex <- unlist(lapply(stringSplit, invalid_utf8_))

  data.frame(
    word = stringSplit[invalidIndex],
    stringIndex = which(invalidIndex == TRUE)
  )

}

x <- "This is a string fa\xE7ile blah blah blah fa\xE7ade"

detect_invalid_utf8(x, " ")

#     word stringIndex
# 1 façile    5
# 2 façade    9