Rendu des caractères encodés en unicode/utf8

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Stéphane Laurent
Messages : 1557
Enregistré le : 05 Déc 2006, 19:07

Rendu des caractères encodés en unicode/utf8

Messagepar Stéphane Laurent » 25 Aoû 2017, 10:39

Bonjour,

Je ne sais pas trop comment on dit, unicode, utf8... Bref.

Dans le package brr, il y a cette fonction :

Code : Tout sélectionner

> brr:::greek_utf8
function (letter)
{
    if (letter %in% c("mu", "phi", "lambda")) {
        return(switch(letter, mu = "µ", phi = "<U+03D5>", lambda = "<U+03BB>"))
    }
    else {
        return(letter)
    }
}

Quand je la lance, j'obtiens une lettre grecque:

Code : Tout sélectionner

> brr:::greek_utf8("phi")
[1] "ϕ"

Mais si je copie-colle cette fonction, ça ne marche pas:

Code : Tout sélectionner

> f <- function (letter)
+ {
+     if (letter %in% c("mu", "phi", "lambda")) {
+         return(switch(letter, mu = "µ", phi = "<U+03D5>", lambda = "<U+03BB>"))
+     }
+     else {
+         return(letter)
+     }
+ }
> f("phi")
[1] "<U+03D5>"

Une explication à ça ?
En fait je suis l'auteur de brr, et je n'ai rien fait de spécial (à l'époque j'ai développe lé package sous Linux et il n'y avait pas de problème, là je suis sous Windows).

J'ai pensé à l'option Encoding=UTF-8 dans DESCRIPTION, mais j'ai essayé la fonction f dans un package avec cette option et non ça ne marche pas.

Charles Marcucci
Messages : 52
Enregistré le : 13 Juil 2016, 09:00

Re: Rendu des caractères encodés en unicode/utf8

Messagepar Charles Marcucci » 28 Aoû 2017, 06:57

bonjour

Une petite recherche sur le forum nous donne le lien suivant http://forums.cirad.fr/logiciel-R/viewtopic.php?t=8204

peut etre essayer l'option

Code : Tout sélectionner

options(encoding = "UTF-8")


bonne journée

jean lobry
Messages : 733
Enregistré le : 17 Jan 2008, 20:00
Contact :

Re: Rendu des caractères encodés en unicode/utf8

Messagepar jean lobry » 02 Sep 2017, 17:46

Bonjour Stéphane,

j'arrive à reproduire le problème sous Mac:

Code : Tout sélectionner

> f <- function (letter)
+ {
+     if (letter %in% c("mu", "phi", "lambda")) {
+         return(switch(letter, mu = "µ", phi = "<U+03D5>", lambda = "<U+03BB>"))
+     }
+     else {
+         return(letter)
+     }
+ }
> f("phi")
[1] "<U+03D5>"
> sessionInfo()
R version 3.4.1 (2017-06-30)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS Sierra 10.12.6

Matrix products: default
BLAS: /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/libRblas.0.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/libRlapack.dylib

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

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

loaded via a namespace (and not attached):
[1] compiler_3.4.1


Bien amicalement,

jean

jean lobry
Messages : 733
Enregistré le : 17 Jan 2008, 20:00
Contact :

Re: Rendu des caractères encodés en unicode/utf8

Messagepar jean lobry » 02 Sep 2017, 18:26

Re-bonjour Stéphane,

j'avais oublié, pour être complet, ça marche très bien avec brr :

Code : Tout sélectionner

> library(brr)
> brr:::greek_utf8("phi")
[1] "ϕ"
> sessionInfo()
R version 3.4.1 (2017-06-30)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS Sierra 10.12.6

Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/libRlapack.dylib

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

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

other attached packages:
[1] brr_1.0.0

loaded via a namespace (and not attached):
 [1] MASS_7.3-47        compiler_3.4.1     deSolve_1.20       magrittr_1.5     
 [5] tools_3.4.1        Rcpp_0.12.11       pander_0.6.1       gsl_1.9-10.3     
 [9] TeachingDemos_2.10 stringi_1.1.5      SuppDists_1.1-9.4  stringr_1.2.0     
[13] digest_0.6.12      contfrac_1.1-11    elliptic_1.3-7     hypergeo_1.2-13   
>


Encore le syndrome de l'encodage de la mort qui tue...

Amicalement,

jean

jean lobry
Messages : 733
Enregistré le : 17 Jan 2008, 20:00
Contact :

Re: Rendu des caractères encodés en unicode/utf8

Messagepar jean lobry » 02 Sep 2017, 18:48

'tain,

jolie question.

Quelqu'un aurait-il un Linux sous le pied pour vérifier la reproductibilité ?

Je donne ma langue au chat.

Amicalement,

jean

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Re: Rendu des caractères encodés en unicode/utf8

Messagepar Eric Casellas » 04 Sep 2017, 07:13

jean lobry a écrit :Quelqu'un aurait-il un Linux sous le pied pour vérifier la reproductibilité ?

Voici ce que ça donne chez moi sous Ubuntu 16.04.3

Code : Tout sélectionner

> f <- function (letter)
+    {
+        if (letter %in% c("mu", "phi", "lambda")) {
+            return(switch(letter, mu = "µ", phi = "<U+03D5>", lambda = "<U+03BB>"))
+        }
+        else {
+            return(letter)
+        }
+ }
>
> f("phi")
[1] "<U+03D5>"
> sessionInfo()
R version 3.4.1 (2017-06-30)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 16.04.3 LTS

Matrix products: default
BLAS: /usr/lib/libblas/libblas.so.3.6.0
LAPACK: /usr/lib/lapack/liblapack.so.3.6.0

locale:
 [1] LC_CTYPE=fr_FR.UTF-8       LC_NUMERIC=C               LC_TIME=fr_FR.UTF-8        LC_COLLATE=fr_FR.UTF-8     LC_MONETARY=fr_FR.UTF-8   
 [6] LC_MESSAGES=fr_FR.UTF-8    LC_PAPER=fr_FR.UTF-8       LC_NAME=C                  LC_ADDRESS=C               LC_TELEPHONE=C           
[11] LC_MEASUREMENT=fr_FR.UTF-8 LC_IDENTIFICATION=C       

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

loaded via a namespace (and not attached):
[1] compiler_3.4.1 tools_3.4.1   
Eric

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Rendu des caractères encodés en unicode/utf8

Messagepar Serge Rapenne » 04 Sep 2017, 10:30

Bonjour,

Je ne peux expliquer pourquoi ça fonctionne dans brr mais pas avec la fonction copié mais je viens de trouver une autre bizarrerie sur Linux
J'ai modifié le code de la fonction comme ça :

Code : Tout sélectionner

f <- function (letter)
{
  if (letter %in% c("mu", "phi","phi2", "lambda")) {
    return(switch(letter, mu = "\U03BC", phi = "\U03D5",phi2 = "\U03C6", lambda = "\U03BB"))
  }
  else {
    return(letter)
  }
}
}

et l'a j'obtiens

Code : Tout sélectionner

 f("mu")
[1] "μ"
f("lambda")
[1] "λ"
#mais
f("phi")
[1]"φ"
f("phi2")
[1]"ϕ"

les caractères U03C6 et U03D5 sont inversés par rapport à ce qu'indique https://fr.wikipedia.org/wiki/Table_des_caract%C3%A8res_Unicode/U0370 ?? ( Debian 9.0 et Centos 7)

EDIT. J'ai installé brr sur ma Debian pour le test et j'obtiens çà

Code : Tout sélectionner

brr:::greek_utf8("phi")
[1] "φ"


EDIT2. Le problème ci dessus semble plus lié mon environnement R qu'à R lui même. Je travaille depuis un navigateur web sous windows adressant un rstudio-server (debian 9). Si je fais

Code : Tout sélectionner

brr:::greek_utf8("phi")
dans la console R, j'obtiens "φ". Par contre, si je fais

Code : Tout sélectionner

plot(1,main=brr:::greek_utf8("phi"))
le titre est bien "ϕ"
Serge

jean lobry
Messages : 733
Enregistré le : 17 Jan 2008, 20:00
Contact :

Re: Rendu des caractères encodés en unicode/utf8

Messagepar jean lobry » 04 Sep 2017, 14:05

Bonjour,

je rectifie : je n'arrive pas à reproduire exactement le bug. Si je fais :

Code : Tout sélectionner

> library(brr)
> brr:::greek_utf8
function (letter)
{
    if (letter %in% c("mu", "phi", "lambda")) {
        return(switch(letter, mu = "μ", phi = "ϕ", lambda = "λ"))
    }
    else {
        return(letter)
    }
}

Je n'ai pas les représentations <U+03D5> et <U+03BB> pour ϕ et λ, respectivement. Et donc si je copie/colle à partir de là ça marche correctement :

Code : Tout sélectionner

> g <- function (letter)
+ {
+     if (letter %in% c("mu", "phi", "lambda")) {
+         return(switch(letter, mu = "μ", phi = "ϕ", lambda = "λ"))
+     }
+     else {
+         return(letter)
+     }
+ }
> g("phi")
[1] "ϕ"


Ça n'explique pas le bug mais ça restreint son domaine d'observation. Dans le fichier source la fonction est codée ainsi :

Code : Tout sélectionner

# Extrait de brr/R/misc.R
greek_utf8 <- function(letter){ #' Unicode encoding of Greek letters
  if(letter %in% c("mu", "phi", "lambda")){
    return(switch(letter,
                  mu="\u03BC", #rawToChar(as.raw(c(0xc2, 0xb5))) (micron)
                  phi= "\u03d5", # rawToChar(as.raw(c(0xcf, 0x95))), # intToUtf8(0x03D5L)
                  lambda="\u03BB"))
  }else{
    return(letter)
  }
}


Les séquences d'échappement unicode sont donc bien gérées sous Mac. Il y a un problème sous Windows, mais là je n'ai plus de piste.

Amicalement,

jean


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité