首先基于 StackOverflow 上更一般的问题不可能 100% 确定地检测文件的编码。
我已经挣扎了很多次并得出非自动解决方案:
Use iconvlist
获取所有可能的编码:
codepages <- setNames(iconvlist(), iconvlist())
然后使用它们中的每一个读取数据
x <- lapply(codepages, function(enc) try(read.table("encoding.asc",
fileEncoding=enc,
nrows=3, header=TRUE, sep="\t"))) # you get lots of errors/warning here
这里重要的是了解文件的结构(分隔符、标题)。使用设置编码fileEncoding
争论。只读取几行。
现在您可以查找结果:
unique(do.call(rbind, sapply(x, dim)))
# [,1] [,2]
# 437 14 2
# CP1200 3 29
# CP12000 0 1
看起来正确的是 3 行 29 列,所以让我们看看它们:
maybe_ok <- sapply(x, function(x) isTRUE(all.equal(dim(x), c(3,29))))
codepages[maybe_ok]
# CP1200 UCS-2LE UTF-16 UTF-16LE UTF16 UTF16LE
# "CP1200" "UCS-2LE" "UTF-16" "UTF-16LE" "UTF16" "UTF16LE"
你也可以看一下数据
x[maybe_ok]
对于您的文件,所有这些编码都会返回相同的数据(部分原因是如您所见存在一些冗余)。
如果您不知道需要使用的文件的具体信息readLines
工作流程发生一些变化(例如,您不能使用fileEncoding
,必须使用length
代替dim
,做更多的魔法来找到正确的)。