UTF-8 / Unicode Text Encoding with RPostgreSQL

j'exécute R sur une machine Windows qui est directement liée à une base de données PostgreSQL. Je ne suis pas en utilisant RODBC. Ma base de données est codé en UTF-8 comme l'a confirmé par la suite de R de la commande:

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

Cependant, quand un texte est lu en R, il s'affiche comme un texte étrange dans R.

par exemple, le texte suivant est affiché dans ma base de données PostgreSQL: "Stéphane"

après exportation vers R Il est indiqué comme: "Stà © phane" (le é est codé comme é)

lors de l'importation à R j'utilise le dbConnect commande d'établir une connexion et le dbGetQuery commande pour interroger les données en utilisant SQL. Je ne spécifie aucun encodage de texte nulle part lors de la connexion à la base de données ou lors de l'exécution d'une requête.

j'ai cherché en ligne et je ne trouve pas de solution directe à mon problème. J'ai trouvé ce lien, mais leur problème est avec RODBC, que je n'utilise pas.

Ce lien est utile en identifiant les symboles, mais je ne veux pas juste faire une recherche et remplacer dans R... bien trop de données.

j'ai essayé d'exécuter les commandes suivantes ci-dessous et je suis arrivé à un avertissement.

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")

L'avertissement se produit sur le Sys.setlocale("LC_ALL", "en_US.UTF-8") la commande. Mon intuition est qu'il s'agit d'un problème spécifique à Windows et qu'il ne se produit pas avec Mac/Linux/Unix.

15
demandé sur Community 2014-01-28 02:12:50

3 réponses

après avoir exporté vers R, Il est affiché comme: "Stà © phane" (Le é Est encodé comme é)

votre environnement R utilise un encodage 1 octet non composé comme latin-1 ou windows-1252. Témoin de ce test en Python, démontrant que les octets utf-8 pour é, décodés comme s'ils étaient latins-1, produisez le texte que vous voyez:

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

SET client_encoding = 'windows-1252' ou corrigez l'encodage utilisé dans votre environnement R. S'il est exécuté dans un cmd.exe console, vous aurez besoin de jouer avec chcp commande de la console; sinon, c'est spécifique à votre exécutable R.

13
répondu Craig Ringer 2014-01-28 05:32:46

comme L'a dit Craig Ringer, mettre client_encoding windows-1252 est probablement pas la meilleure chose à faire. En effet, si les données que vous récupérez contient un seul caractère exotique, vous êtes en difficulté:

Erreur dans postgresqlExecStatement(conn, la motivation, la ...): RS-DBI pilote: (impossible de récupérer le résultat : erreur: caractère 0xcca7 de l'encodage "UTF-8" n'a pas d'équivalent en "WIN1252" )

d'un autre côté, obtenir votre environnement R pour utiliser Unicode pourrait être impossible (j'ai le même problème que vous avec Sys.setlocale... Même dans cette question trop.).

une solution consiste à déclarer manuellement L'encodage UTF-8 sur toutes vos données, en utilisant une fonction comme celle-ci:

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
}

Et vous devez utiliser cette fonction dans toutes vos requêtes:

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

EDIT: une Autre possibilité est d'utiliser RPostgres au lieu de RPostgreSQL. Je l'ai testé (avec le même config comme dans votre question), et pour autant que je puisse voir tous les encodages déclarés sont automatiquement positionnés sur UTF-8.

6
répondu Scarabee 2017-05-23 12:10:10

cela corrigera tout problème Unicode/UTF-8 sous Windows. Il doit être exécuté avant d'interroger la base de données.

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

tiré de l'auto-réponse égarée d'asker, visible dans l'historique de révision des questions

1
répondu Nathan Tuggy 2017-05-13 00:40:14