web-dev-qa-db-fra.com

Comment source () .R fichier enregistré en utilisant le codage UTF-8?

Les éléments suivants, lorsqu'ils sont copiés et collés directement dans R, fonctionnent correctement:

> character_test <- function() print("R同时也被称为GNU S是一个强烈的功能性语言和环境,探索统计数据集,使许多从自定义数据图形显示...")
> character_test()
[1] "R同时也被称为GNU S是一个强烈的功能性语言和环境,探索统计数据集,使许多从自定义数据图形显示..."

Cependant, si je crée un fichier appelé character_test.R contenant le code EXACT SAME, enregistrez-le au format UTF-8 (afin de conserver les caractères chinois spéciaux), puis, lorsque je le source (), il dans R, I obtenez l'erreur suivante:

> source(file="C:\\Users\\Tony\\Desktop\\character_test.R", encoding = "UTF-8")
Error in source(file = "C:\\Users\\Tony\\Desktop\\character_test.R", encoding = "utf-8") : 
  C:\Users\Tony\Desktop\character_test.R:3:0: unexpected end of input
1: character.test <- function() print("R
2: 
  ^
In addition: Warning message:
In source(file = "C:\\Users\\Tony\\Desktop\\character_test.R", encoding = "UTF-8") :
  invalid input found on input connection 'C:\Users\Tony\Desktop\character_test.R'

Toute aide que vous pouvez offrir pour résoudre et m'aider à comprendre ce qui se passe ici serait très appréciée.

> sessionInfo() # Windows 7 Pro x64
R version 2.12.1 (2010-12-16)
Platform: x86_64-pc-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United Kingdom.1252 
[2] LC_CTYPE=English_United Kingdom.1252   
[3] LC_MONETARY=English_United Kingdom.1252
[4] LC_NUMERIC=C                           
[5] LC_TIME=English_United Kingdom.1252    

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

loaded via a namespace (and not attached):
[1] tools_2.12.1

et

> l10n_info()
$MBCS
[1] FALSE

$`UTF-8`
[1] FALSE

$`Latin-1`
[1] TRUE

$codepage
[1] 1252
36
Tony Breyal

Nous en avons beaucoup parlé dans les commentaires de mon précédent message, mais je ne veux pas que cela se perde à la page 3 des commentaires: vous devez définir les paramètres régionaux, cela fonctionne avec les deux entrées de la console R (voir capture d'écran dans commentaires) ainsi qu’avec l’entrée du fichier voir cette capture d’écran:

Le fichier "myfile.r" contient:

russian <- function() print ("Американские с...");

La console contient:

source("myfile.r", encoding="utf-8")
> Error in source(".....
Sys.setlocale("LC_CTYPE","ru")
> [1] "Russian_Russia.1251"
russian()
[1] "Американские с..."

Notez que le fichier entrant échoue et qu'il pointe sur le même caractère que l'erreur de l'affiche originale (celle qui suit "R). Je ne peux pas le faire avec le chinois car je devrais installer" Microsoft Pinyin IME 3.0 ", mais le processus est identique, il suffit de remplacer les paramètres régionaux par "chinois" (le nom est un peu incohérent, consultez la documentation).

23
Bernd Elkemann

Sur R/Windows, source rencontre des problèmes avec tous les caractères UTF-8 qui ne peuvent pas être représentés dans les paramètres régionaux en cours (ou dans la page de code ANSI sous Windows). Et malheureusement, Windows n’a pas l’UTF-8 disponible en tant que page de code ANSI - Windows a une limite technique: les pages de code ANSI ne peuvent être que des codages à un ou deux octets par caractère, pas des codages à octets variables comme 8.

Cela ne semble pas être un problème fondamental insoluble - il y a simplement un problème avec la fonction source. Vous pouvez obtenir 90% du chemin là-bas en faisant ceci à la place:

eval(parse(filename, encoding="UTF-8"))

Cela fonctionnera presque exactement comme source() avec les arguments par défaut, mais ne vous laissera pas faire echo = T, eval.print = T, etc.

26
Joe Cheng

Pour moi (sur les fenêtres) je fais:

source.utf8 <- function(f) {
    l <- readLines(f, encoding="UTF-8")
    eval(parse(text=l),envir=.GlobalEnv)
}

Ça fonctionne bien.

5
crow16384

Je pense que le problème réside avec R. Je peux me procurer avec bonheur des fichiers UTF-8 ou UCS-2LE contenant de nombreux caractères non-ASCII. Cependant, certains caractères le font échouer. Par exemple ce qui suit

danish <- function() print("Skønt H. C. Andersens barndomsomgivelser var meget fattige, blev de i hans rige fantasi solbeskinnede.")
croatian <- function() print("Dodigović. Kako se Vi zovete?")
new_testament <- function() print("Ne provizu al vi trezorojn sur la tero, kie tineo kaj rusto konsumas, kaj jie ŝtelistoj trafosas kaj ŝtelas; sed provizu al vi trezoron en la ĉielo")
russian <- function() print ("Американские суда находятся в международных водах. Япония выразила серьезное беспокойство советскими действиями.")

est très bien dans UTF-8 et UCS-2LE sans la ligne russe. Mais si cela est inclus, cela échoue. Je pointe le doigt vers R. Votre texte en chinois semble également être trop difficile pour R sous Windows.

Le lieu semble ne pas être pertinent ici. C'est juste un fichier, vous lui dites en quel encodage il s'agit, pourquoi vos paramètres régionaux importent-ils?

4
David Heffernan

Sous Windows, lorsque vous copiez-collez une chaîne codée Unicode ou Utf-8 dans un contrôle de texte défini sur entrée à octet unique (ascii ... en fonction de la langue), les octets inconnus sont remplacés par des points d'interrogation. Si je prends les 4 premiers caractères de votre chaîne et les copier-coller, par ex. Bloc-notes, puis enregistrez-le, le fichier devient hexadécimal: 

52 3F 3F 3F 3F

ce que vous devez faire est de trouver un éditeur que vous pouvez définir sur utf-8 before copier-coller le texte dedans, le fichier sauvegardé (de vos 4 premiers caractères) devient:

52 E5 90 8C E6 97 B6 E4 B9 9F E8 A2 AB

Ceci sera alors reconnu comme valide par utf-8 par [R].

J'ai utilisé "Notepad2" pour essayer ceci, mais je suis sûr qu'il y en a beaucoup plus.

1
Bernd Elkemann

Je rencontre ce problème lorsqu’on essaie de créer un fichier .R contenant des caractères chinois. Dans mon cas, j’ai trouvé que mettre simplement "LC_CTYPE" sur "chinois" ne suffisait pas. Mais définir "LC_ALL" sur "chinois" fonctionne bien. 

Notez qu'il n'est pas suffisant de coder correctement lorsque vous lisez ou écrivez un fichier texte brut dans Rstudio (ou R?) Avec un format non-ASCII. Les paramètres régionaux comptent aussi.

PS. la commande est Sys.setlocale (category = "LC_CTYPE", locale = "chinois"). Veuillez remplacer la valeur de la locale en conséquence. 

0
user2473519

S'appuyant sur crow's answer , cette solution permet au bouton RStudio de Source de fonctionner.

Lorsque vous cliquez sur ce bouton Source, RStudio exécute source('myfile.r', encoding = 'UTF-8')), donc remplacer source fait disparaître les erreurs et exécute le code comme prévu:

source <- function(f, encoding = 'UTF-8') {
    l <- readLines(f, encoding=encoding)
    eval(parse(text=l),envir=.GlobalEnv)
}
0
Domi