R RMySQL 查询使日文字符变形

R RMySQL query deforms japanese characters

我正在使用 RMySQL 连接到 aws MySQL 服务器。它有效,除了字符值变形。之前有人问过这个问题,但这些修复似乎对我不起作用。这是我正在做的事情:

确保没有打开的连接:

dbListConnections(MySQL()) list()

确保我的连接设置为使用 UTF-8:

dbGetQuery(credentials, "show variables like 'character_set%'")

             Variable_name                                     Value
1     character_set_client                                      utf8
2 character_set_connection                                      utf8
3   character_set_database                                      utf8
4 character_set_filesystem                                      utf8
5    character_set_results                                      utf8
6     character_set_server                                      utf8
7     character_set_system                                      utf8
8       character_sets_dir /rdsdbbin/mysql-5.5.40.R1/share/charsets/

获取数据:

data <- dbGetQuery(credentials, Query) head(data) keyword_ja 1 6 2 6蜀ャ 3 6螟\x8f 4 6譌・譛ャ莠コ 5 7繧、繝ゥ繧ケ繝\x88 6 7蜿守ゥォ

当我将此数据写入磁盘时 Excel 显示相同的变形字符,但 notepad++ 可以以某种方式按预期显示日语:

"keyword_ja"

"冬" “夏” “日本人” “伊拉苏托” "收获"

我一直在尝试使用 R 中的 Encoding() 和 enc2utf8() 等函数来使其像 notepad++ 一样正确显示字符,但没有成功。

Encoding(head(data$keyword_ja))

[1] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"

enc2utf8(head(data$keyword_ja))

[1] "6" "6蜀ャ" "6螟<8f>" "6譌・譛ャ莠コ" "7繧、繝ゥ繧ケ繝<88>" "7蜿守ゥォ"

我可以正常输入日文字符,R 显示它们也没有问题

Sys.getlocale() [1] "LC_COLLATE=Japanese_Japan.932;LC_CTYPE=Japanese_Japan.932;LC_MONETARY=Japanese_Japan.932;LC_NUMERIC=C;LC_TIME=Japanese_Japan.932" mystring <- "日本語入力できる" mystring [1] "日本語入力できる" Encoding(mystring) [1] "unknown"

我非常想解决这个问题,非常感谢您的帮助。如果我可以提供更多信息,请告诉我。

到目前为止我发现的唯一(糟糕的)解决方法是使用 write.csv 将数据写入磁盘,然后使用 data.table 包中的 fread 将其读回。结果如下:

fread("test.csv", 编码="UTF-8") keyword_ja \036 \036冬 \036夏 \036日本人 \037イラスト

接近我想要的,它有正确的日文单词,但有一些隐藏字符,如 \036 在它们之前

基于 this SO article,您可能需要使用 UTF-8 编码将数据写入 到磁盘。试试这个:

data <- dbGetQuery(credentials, Query)
con <- file('output.csv', encoding="utf8")
write.csv(data, file=con)

然后尝试在 Excel 和 Notepad++ 中打开 output.csv 并让我们知道结果。当您将此文件读回 R 时,它应该按预期运行:

fread("test.csv", encoding="UTF-8")