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


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

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


5972
2018-06-25 07:13


起源



答案:


另一种解决方案 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

13
2018-06-25 08:01





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

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

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


1
2018-06-25 07:53





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

library(dplyr)

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

哪里 MyData 和 MyTextVar 是数据集和文本变量来删除坏苹果。这可能不如改变编码那么健壮,但通常只需删除它们就可以了。


1
2017-08-15 13:23



在Tyler的回答中,你也可以考虑一下 MyDate %>% mutate_if(is.character, ~gsub('[^ -~]', '', .)) 它针对所有字符列或 MyData %>% mutate_all(~gsub('[^ -~]', '', .)) 它针对所有列。 - sbha


答案:


另一种解决方案 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

13
2018-06-25 08:01





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

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

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


1
2018-06-25 07:53





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

library(dplyr)

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

哪里 MyData 和 MyTextVar 是数据集和文本变量来删除坏苹果。这可能不如改变编码那么健壮,但通常只需删除它们就可以了。


1
2017-08-15 13:23



在Tyler的回答中,你也可以考虑一下 MyDate %>% mutate_if(is.character, ~gsub('[^ -~]', '', .)) 它针对所有字符列或 MyData %>% mutate_all(~gsub('[^ -~]', '', .)) 它针对所有列。 - sbha