我有一个包含名称表的MySQL数据库。一旦将它们放入R中,我就会遇到一些编码问题,这些问题我不了解,但似乎与R解释文件的方式有关。
con <- dbConnect(MySQL(),
host = 'localhost',
user = 'root',
dbname='test',
rstudioapi::askForPassword('Database password')
)
并使用
从我的MySQL数据库中提取names
表
df <- dbReadTable(con, 'names')
我的桌子看起来像
df <- structure(list(id = c(373863, 17731249), name = c("AARESTRUP, JAN CARO̸E",
"BÃœTTNER, CHRISTIAN")), .Names = c("id", "name"), class = "data.frame", row.names = c(NA,
-2L))
df
id name
1 373863 AARESTRUP, JAN CARO̸E
2 17731249 BÃœTTNER, CHRISTIAN
检查编码是否带来
Encoding(df$name)
[1] "unknown" "unknown"
使用Encoding(df$name) <- "UTF-8"
固定第二个名称,但将名称的一部分转换为非UTF-8字符。
df
id name
1 373863 AARESTRUP, JAN CARO<U+0338>E
2 17731249 BÜTTNER, CHRISTIAN
现在,当df$name[1]
返回时,它变得很奇怪
[1] "AARESTRUP, JAN CARO̸E"
正是它存储在MySQL数据库中的方式,而当我调用整个df
时,它似乎有不同的解释。
首先,有一种方法可以确保dbReadTable()
自动读入UTF-8
。我发现link似乎在表编码方面没有任何改变。
第二,根据您访问名称的方式(整个df与单个元素),非UTF-8编码在解释上的差异是怎么回事
答案 0 :(得分:1)
<U+0338>
是UTF-8 character。但这是一个叠加字符,在渲染时与它前面的O占据相同的空间。由于某种原因,它显示不正确(尽管我检查了一下,在R中它显示正确,所以似乎与StackOverflow或Firefox有关)。您可以使用
apply(df, MARGIN = 2, FUN = function(x) if( typeof(x) == 'character' ) Encoding(x)<-'UTF-8')
在所有数据库结果表上,这会将所有字符列的编码转换为UTF-8。
我认为调用df$name[1]
与调用df
之间的行为差异与字符类型对象与data.frames的不同打印/显示方法有关。
df
希望向您显示各个字符,这意味着它不想以掩盖E的事实显示两个字符的方式渲染字符。它也不想将字符显示为空格字符,因为这样看起来像反斜杠。显示字符的unicode是让用户知道它的最佳方法。
字符类型对象的show方法想(大多数情况下)为您呈现字符。