dselivanov / rmongodb

R driver for MongoDB
53 stars 26 forks source link

Encode UTF-8 #83

Open vitorefigenio opened 9 years ago

vitorefigenio commented 9 years ago

When I was reading a dataset from MongoDb on my program I had a problem with encode. My code:

mongo <- mongo.create(host = "127.0.0.1")
mongo.is.connected(mongo)
mongo.get.databases(mongo)
db <- "music-project"
mongo.get.database.collections(mongo, db)
coll <- mongo.get.database.collections(mongo, db)
mongo.count(mongo, coll)
music <- mongo.find.one(mongo, coll[2], '{"music":"A Carta"}')
data <- mongo.bson.to.list(music)
print(data)

Result:

$title
[1] " A Carta "

$artist
[1] "Djavan"

$composition
[1] "Não vá levar tudo tão a sério Sentindo que dá, deixa correr Se souber confiar no seu critério Nada a temer Não vá levar tudo tão na boa Brigue para obter o melhor Se errar por amor Deus abençoa Seja vocêNo que sua crença vacilou A flor da dúvida se abriu Vou ler a carta que o Biel mandou Pra você, lá do Brasil:\"Eles me disseram tanta asneira, disseram só besteira Feito todo mundo diz. Eles me disseram que a coleira e um prato de ração Era tudo o que um cão sempre quis Eles me trouxeram a ratoeira com um queijo de primeira Que me, que me pegou pelo nariz Me deram uma gaiola como casa, amarraram minhas asas E disseram para eu ser felizMas como eu posso ser feliz num poleiro? Como eu posso ser feliz sem pular ? Mas como eu posso ser feliz num viveiro, Se ninguém pode ser feliz sem voar?Ah, segurei o meu pranto para transformar em canto E para meu espanto minha voz desfez os nós Que me apertavam tanto E já sem a corda no pescoço, sem as grades na janela E sem o peso das algemas na mão Eu encontrei a chave dessa cela Devorei o meu problema e engoli a solução Ah, se todo o mundo pudesse saber Como é fácil viver fora dessa prisão E descobrisse que a tristeza tem fim E a felicidade pode ser simples como um aperto de mão Entendeu?É esse o vírus que eu sugiro que você contraia Na procura pela cura da loucura, Quem tiver cabeça dura vai morrer na praia.\""

$music
[1] "A Carta"

There is an encode problem with data$compostion, as you can see. I had tried use library(stringi), didn't work. I had tried use raw, Encode and didn't work, too.

Do you know how can I import MongoDb collectin Data with a different encode?

dselivanov commented 9 years ago

Please, provide sessionInfo() output. BSON strings are UTF-8 Try to execute your query in mongo shell. What you will get?

vitorefigenio commented 9 years ago

Tks for answer @dselivanov I ran the code on MongoShell db['djavan-music'].find() and this code showed me this:

db['djavan-music'].find()
{
    "_id" : "4d2dbfc0eff246cd70d61a00",
    "title" : " A Carta ",
    "artist" : "Djavan",
    "composition" : "Não vá levar tudo tão a sério Sentindo que dá, deixa correr Se souber confiar no seu critério Nada a temer Não vá levar tudo tão na boa Brigue para obter o melhor Se errar por amor Deus abençoa Seja vocêNo que sua crença vacilou A flor da dúvida se abriu Vou ler a carta que o Biel mandou Pra você, lá do Brasil:\"Eles me disseram tanta asneira, disseram só besteira Feito todo mundo diz. Eles me disseram que a coleira e um prato de ração Era tudo o que um cão sempre quis Eles me trouxeram a ratoeira com um queijo de primeira Que me, que me pegou pelo nariz Me deram uma gaiola como casa, amarraram minhas asas E disseram para eu ser felizMas como eu posso ser feliz num poleiro? Como eu posso ser feliz sem pular ? Mas como eu posso ser feliz num viveiro, Se ninguém pode ser feliz sem voar?Ah, segurei o meu pranto para transformar em canto E para meu espanto minha voz desfez os nós Que me apertavam tanto E já sem a corda no pescoço, sem as grades na janela E sem o peso das algemas na mão Eu encontrei a chave dessa cela Devorei o meu problema e engoli a solução Ah, se todo o mundo pudesse saber Como é fácil viver fora dessa prisão E descobrisse que a tristeza tem fim E a felicidade pode ser simples como um aperto de mão Entendeu?É esse o vírus que eu sugiro que você contraia Na procura pela cura da loucura, Quem tiver cabeça dura vai morrer na praia.\"",
    "music" : "A Carta"
}

My session info in R showed me this:

> sessionInfo()
R version 3.1.3 (2015-03-09)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

locale:
[1] LC_COLLATE=Portuguese_Brazil.1252  LC_CTYPE=Portuguese_Brazil.1252   
[3] LC_MONETARY=Portuguese_Brazil.1252 LC_NUMERIC=C                      
[5] LC_TIME=Portuguese_Brazil.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] tm_0.6         NLP_0.1-6      stringi_0.4-1  httr_0.6.1    
[5] devtools_1.7.0 rmongodb_1.8.0 RMongo_0.0.25  rJava_0.9-6   

loaded via a namespace (and not attached):
[1] bitops_1.0-6    jsonlite_0.9.15 parallel_3.1.3  plyr_1.8.1     
[5] Rcpp_0.11.5     RCurl_1.95-4.5  slam_0.1-32     stringr_0.6.2  
[9] tools_3.1.3
dselivanov commented 9 years ago

I suppose this is problem of converting utf-8 to cp1252. Did you try to set your default encoding to utf-8? I recommend to use utf-8 in all caases you can. Also there are many problems with other packages (for example tm for text mining) with non utf encodings. Also you can ask this question on stackoverflow.

mikesebald commented 8 years ago

Same problem on German Windows

> sessionInfo()
R version 3.2.2 (2015-08-14)
Platform: i386-w64-mingw32/i386 (32-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

locale:
[1] LC_COLLATE=German_Germany.1252  LC_CTYPE=German_Germany.1252    LC_MONETARY=German_Germany.1252
[4] LC_NUMERIC=C                    LC_TIME=German_Germany.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] rmongodb_1.8.0

loaded via a namespace (and not attached):
[1] plyr_1.8.3        rsconnect_0.4.1.4 tools_3.2.2       rstudioapi_0.3.1  Rcpp_0.12.1       jsonlite_0.9.17  
> 

Using mongo shell:

                                "name" : "Birkhäuser Verlag GmbH",

In RStudio:

[1] "Birkhäuser Verlag GmbH"
dselivanov commented 8 years ago

@mikesebald did you try to use UTF-8 in your session?

mikesebald commented 8 years ago

None of the following does work for me:

> Sys.setlocale(category = "LC_ALL", locale = "en_GBs.UTF-8")
[1] ""
Warning message:
In Sys.setlocale(category = "LC_ALL", locale = "en_GBs.UTF-8") :
  OS reports request to set locale to "en_GBs.UTF-8" cannot be honored
> Sys.setlocale(category = "LC_ALL", locale = "de_DE.UTF-8")
[1] ""
Warning message:
In Sys.setlocale(category = "LC_ALL", locale = "de_DE.UTF-8") :
  OS reports request to set locale to "de_DE.UTF-8" cannot be honored
> 

Also: read.csv() from a utf8 encoded file works just fine. I don't have any other utf8 related issues. This is why I am suspecting it is somewhere in the rmongodb package.

mikesebald commented 8 years ago

Sorry: also the following doesn't work:

> Sys.setlocale(category = "LC_ALL", locale = "en_GB.UTF-8")
[1] ""
Warning message:
In Sys.setlocale(category = "LC_ALL", locale = "en_GB.UTF-8") :
  OS reports request to set locale to "en_GB.UTF-8" cannot be honored
> 
mikesebald commented 8 years ago

It does work fine on OS X though, where

> sessionInfo()
R version 3.2.2 (2015-08-14)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.11.2 (El Capitan)

locale:
[1] de_DE.UTF-8/de_DE.UTF-8/de_DE.UTF-8/C/de_DE.UTF-8/de_DE.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] rmongodb_1.8.0

loaded via a namespace (and not attached):
[1] plyr_1.8.3      tools_3.2.2     Rcpp_0.12.2     jsonlite_0.9.19
dselivanov commented 8 years ago

Seems you need to somehow set locale to de_DE.UTF-8 on your windows machine, but I can't help with that (and don't know whether it is possible).

mikesebald commented 8 years ago

@dselivanov Many thanks for your reply. However I am not convinced this will solve the issue because I don't haven such problems with processing UTF-8 CSV files. Only using rmongodb I don't succeed.

dselivanov commented 8 years ago

Understand you, but unfortunately don't think I can do something with encoding problems at rmongodb side :-( Have a look to mongolite, which is much more actively maintained. May be you will have more luck with it.

mikesebald commented 8 years ago

@dselivanov Many thanks! I have just tried mongolite and it indeed works.