2014-01-27 4 views
16

Я запускаю R на машине Windows, которая напрямую связана с базой данных PostgreSQL. Я не использую RODBC. Моя база данных кодируется в UTF-8, как подтверждено с помощью следующей команды R:UTF-8/кодировка кодировки Unicode с RPostgreSQL

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

Однако, когда какой-нибудь текст читается в R, он показывает, как странный текст в R.

Например, следующее текст отображается в моей базе данных PostgreSQL: «Stephane»

После экспорта в R это показано как: «STA © phane» (é кодируется как Ã ©)

При импорте в R я использую команду dbConnect для установления соединения и команду dbGetQuery для запроса данных с использованием SQL. Я не указываю никакого текстового кодирования нигде при подключении к базе данных или при выполнении запроса.

Я искал в Интернете и не могу найти прямое решение по моей проблеме. Я нашел this link, но их проблема с RODBC, которую я не использую.

This link полезен при идентификации символов, но я не просто хочу найти нуль & заменить в 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.

+1

Обратите внимание, что 'client_encoding' * не * фактическое кодирование используется в вашей базе данных. Вы можете найти кодировку для базы данных, используя опцию 'psql -l' или команду' \ l'. – nwellnhof

ответ

13

After exporting to R it's shown as: "Stéphane" (the é is encoded as é)

В вашей среде R используется 1-байтовая несложенная кодировка, такая как latin-1 или windows-1252. Свидетель этого теста в Python, демонстрируя, что UTF-8 байт для é, декодирование, как если бы они были латиными-1, производят текст, который вы видите:

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

Либо SET client_encoding = 'windows-1252' или исправить кодировку вашего R среда использует. Если он запущен в консоли cmd.exe, вам нужно будет использовать консольную команду chcp; в противном случае это зависит от вашего времени выполнения R.

+1

Да, это работает. Я выполнил команду 'postgresqlpqExec (con," SET client_encoding = 'windows-1252' ")' перед загрузкой данных из PostgreSQL, и даже если система возвращает 'FALSE', она все еще преобразуется в нужный символ. Благодаря! –

+4

@DavidL Просто имейте в виду, что если вы примете этот подход, и ваши данные содержат символы, которые не могут быть представлены в Windows-1252, запросы будут терпеть неудачу с ошибками кодирования. Если возможно, было бы * лучше * получить вашу среду R, используя Unicode. –

+0

Как настроить среду R, используя Unicode? –

5

Как сказал Крейг Рингер, установка client_encoding на windows-1252, вероятно, не самая лучшая вещь. Действительно, если данные вы извлечения содержит один экзотический характер, вы в беде:

Error in postgresqlExecStatement(conn, statement, ...) : RS-DBI driver: (could not Retrieve the result : ERROR: character 0xcca7 of encoding "UTF8" has no equivalent in "WIN1252")

С другой стороны, получить вашу R среды использовать Unicode может быть невозможно (у меня такая же проблема, как вы с Sys.setlocale ... То же самое в this question тоже.).

Обойти это вручную указать кодировку UTF-8 на всех ваших данных, используя функцию как этот:

set_utf8 = function(x){ 
    # Declare UTF-8 encoding on all character strings: 
    for (i in 1:ncol(x)){ 
    if (is.character(x[, i])) Encoding(x[, i]) <- "UTF-8" 
    } 
    # Same on column names: 
    for (name in colnames(x)){ 
    Encoding(name) <- "UTF-8" 
    } 
    x 
} 

И вы должны использовать эту функцию во всех ваших запросов:

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

EDIT: Другая возможность заключается в использовании RPostgres unstead из RPostgreSQL. Я тестировал его (с тем же конфигом, что и в вашем вопросе), и насколько я вижу, все объявленные кодировки автоматически устанавливаются в UTF-8.

0

Это устранит любые проблемы Unicode/UTF-8 в Windows. Он должен быть выполнен перед запросом базы данных.

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

Образована из неуместной уверенности в ответ Аскера, видимую в вопросе истории пересмотра

+0

Это уже было предложено в ответе Крейга Рингера. – Scarabee

+0

@Scarabee: Я проверил перед публикацией, и у Крейга было меньше подробностей об этом, отметив только, что для установки 'client_encoding' потребуется определенный R-runtime-специфический способ. –

Смежные вопросы