R:数据帧中狭窄空间的错误编码以及生成的.csv

时间:2019-01-28 13:04:55

标签: r character-encoding

我抓取数据并接收到一些字符变量,这些字符变量包含一个狭窄的不间断空格(Unicode U + 202F)。如果所得的字符变量在矢量中,则在R中显示良好。例如,测试返回在控制台中显示为狭窄的空间:

test <- "variable1&#8239;variable2"
<br>
test
(此处为html代码,因为代码环境没有显示狭窄的空间)

但是,如果我将向量添加到列表/数据帧/小标题,它将显示为variable1<U+202F>variable2。如果我使用fileEncoding = "UTF-8"将此数据帧另存为csv文件,并使用相应的编码将其打开,则仍会在观察结果中显示。我现在的解决方法是使用gsub,但我想知道自己做错了什么。

3 个答案:

答案 0 :(得分:3)

罪犯是format.default

test <- "variable1\u202Fvariable2"
print(test)
[1] "variable1 variable2"
format(test)
#[1] "variable1<U+202F>variable2"

formatformat.data.frame调用,而print.data.frame又被调用。

一种解决方案可能是定义一个字符方法:

format.character <- function(x, ...) x

DF <- data.frame(x = 1:5) #beware of stringsAsFactors
DF$test <- test
DF #spaces are actually thin spaces in R console
#  x                test
#1 1 variable1 variable2
#2 2 variable1 variable2
#3 3 variable1 variable2
#4 4 variable1 variable2
#5 5 variable1 variable2

显然,这种简单的方法将破坏依赖于其他format自变量的函数。

OTOH,为什么您要关心打印稀疏的空间?

答案 1 :(得分:0)

一种方法是使用gsub将所有unicode字符转换为空白:

text <- "variable1\u202Fvariable2"
new_text <- gsub("[^\x20-\x7E]", " ", text)

在这里,我匹配所有常用ASCII字符的取反,范围从十六进制代码20(SPACE)到7E(〜)。这种方法的缺点是,您可能会无意中删除了超出期望的内容,但是您始终可以在字符类中添加排除项。

输出:

> format(text)
[1] "variable1<U+202F>variable2"

> format(new_text)
[1] "variable1 variable2"

答案 2 :(得分:0)

有同样问题的人:有一个名为textclean的程序包,它用replace_non_ascii()替换或删除了非ASCII字符。