关于堆栈溢出的几个问题已经处理了R中的“无效多字节字符串”错误,当某些字符串处理函数接收到未正确设置字符串编码的字符串时,会触发该错误。有关如何设置编码的答案,请参阅stackoverflow.com/questions/14363085/invalid-multibyte-string-in-read-csv或stackoverflow.com/questions/4993837/r-invalid-multibyte-string。
我的问题是:我如何发现问题所在?这是必要的,因为可能无法通过肉眼检查知道何时错误编码仅在长向量的少数元素中,或在大型数据帧的列中。
发布于 2016-02-24 06:55:11
这个简单的例程使用一个触发错误的基函数来测试错误:
has.invalid.multibyte.string <- function(x,return.elements=F)
{
# determine if "invalid multibyte string" error will be triggered
# if return.elements=T, then output is logical along x, otherwise single logical
if (is.null(x))
return(F)
if (return.elements)
{
n <- length(x)
out <- rep(F,n)
for (i in 1:n)
out[i] <- is.error(try(toupper(x[i]),silent = T))
}
else
out <- is.error(try(toupper(x),silent = T))
return(out)
}
is.error <- function(x)
{
# test output of try()
return(class(x)[1]=="try-error")
}示例(请注意“更正”编码的iconv()语句):
> a1 <- c("Restaurant","Caf\xe9","Bar")
> a2 <- iconv(a1,from="ISO-8859-1")
> a1
[1] "Restaurant" "Caf\xe9" "Bar"
> a2
[1] "Restaurant" "Café" "Bar"
> Encoding(a1)
[1] "unknown" "unknown" "unknown"
> Encoding(a2)
[1] "unknown" "UTF-8" "unknown"
> has.invalid.multibyte.string(a1)
[1] TRUE
> has.invalid.multibyte.string(a2)
[1] FALSE
> has.invalid.multibyte.string(a1,return.elements = T)
[1] FALSE TRUE FALSE发布于 2020-12-23 04:47:12
从R版本3.3.0 (发布于2016年5月)开始,基本R包含函数validEnc(),该函数返回一个逻辑向量,指示字符向量的每个元素是否具有有效编码。例如:
validEnc(c("Caf\xe9", "Café"))
# [1] FALSE TRUEhttps://stackoverflow.com/questions/35589887
复制相似问题