22

我在直接链接到 PostgreSQL 数据库的 Windows 机器上运行 R。我没有使用 RODBC。我的数据库以 UTF-8 编码,由以下 R 命令确认:

dbGetQuery(con, "SHOW CLIENT_ENCODING")
#   client_encoding
# 1            UTF8

但是,当某些文本被读入 R 时,它会在 R 中显示为奇怪的文本。

例如,以下文本显示在我的 PostgreSQL 数据库中:“Stéphane”

导出到 R 后显示为:“Stéphane”(é编码为é ©

导入到 RI 时,使用dbConnect命令建立连接并dbGetQuery使用 SQL 查询数据的命令。在连接到数据库或运行查询时,我没有在任何地方指定任何文本编码。

我在网上搜索并找不到直接解决我的问题的方法。我找到了这个链接,但他们的问题是我没有使用的 RODBC。

此链接有助于识别符号,但我不只是想在 R 中进行查找和替换...太多的数据。

我确实尝试在下面运行以下命令,但收到了警告。

Sys.setlocale("LC_ALL", "en_US.UTF-8")
# [1] ""
# Warning message:
# In Sys.setlocale("LC_ALL", "en_US.UTF-8") :
#   OS reports request to set locale to "en_US.UTF-8" cannot be honored
Sys.setenv(LANG="en_US.UTF-8")
Sys.setenv(LC_CTYPE="UTF-8")

警告出现在Sys.setlocale("LC_ALL", "en_US.UTF-8")命令上。我的直觉是,这是一个特定于 Windows 的问题,Mac/Linux/Unix 不会发生。

4

5 回答 5

17

正如 Craig Ringer 所说,设置client_encoding为 windows-1252 可能不是最好的选择。事实上,如果您检索的数据包含一个奇异字符,那么您就有麻烦了:

postgresqlExecStatement(conn, statement, ...) 中的错误:RS-DBI 驱动程序:(无法检索结果:错误:编码“UTF8”的字符 0xcca7 在“WIN1252”中没有等效项)

另一方面,让你的 R 环境使用 Unicode 可能是不可能的(我和你有同样Sys.setlocale的问题......这个问题也一样。)。

一种解决方法是使用如下函数手动声明所有数据的 UTF-8 编码:

set_utf8 <- function(x) {
  # Declare UTF-8 encoding on all character columns:
  chr <- sapply(x, is.character)
  x[, chr] <- lapply(x[, chr, drop = FALSE], `Encoding<-`, "UTF-8")
  # Same on column names:
  Encoding(names(x)) <- "UTF-8"
  x
}

您必须在所有查询中使用此功能:

set_utf8(dbGetQuery(con, "SELECT myvar FROM mytable"))

编辑:另一种可能性是使用RPostgres而不是 RPostgreSQL。我对其进行了测试(使用与您的问题相同的配置),据我所知,所有声明的编码都自动设置为 UTF-8。

于 2017-01-27T18:37:34.450 回答
13

导出到 R 后显示为:“Stéphane”(é 编码为 é)

您的 R 环境使用 1 字节非组合编码,如 latin-1 或 windows-1252。在 Python 中见证这个测试,证明 utf-8 字节é,像 latin-1 一样被解码,产生你看到的文本:

>>> print u"é".encode("utf-8").decode("latin-1")
é

或者SET client_encoding = 'windows-1252'修复您的 R 环境使用的编码。如果它在cmd.exe控制台中运行,则需要弄乱chcp控制台命令;否则它特定于您的 R 运行时。

于 2014-01-28T05:32:46.980 回答
4

如果您使用 RPostgres::Postgres() 作为 dbConnect() 的第一个参数,通常您不会遇到编码问题。

我在遇到同样问题的地方尝试了这个脚本,现在我的重音字符没问题。

dbConnect(RPostgres::Postgres(),user="user",password="psw",host="host",port=5432,dbname="db_name")
于 2020-03-30T12:40:52.137 回答
1

这将修复 Windows 中的任何 Unicode/UTF-8 问题。它必须在查询数据库之前执行。

postgresqlpqExec(con, "SET client_encoding = 'windows-1252'")

从提问者错误的自我回答中提取,在问题修订历史中可见

于 2017-05-13T00:40:14.647 回答
-1

这样做:

con <- dbConnect("...", encoding = "latin1")
于 2019-06-05T19:56:08.903 回答