2011-02-17 12 views
32

A continuación, cuando se copia y pegado directamente en R funciona bien:¿Cómo se guarda() el archivo .R guardado con la codificación UTF-8?

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

Sin embargo, si hago un archivo llamado character_test.R que contiene el código exactamente igual, guardarlo en codificación UTF-8 (por lo como para retener los caracteres chinos especiales), a continuación, cuando la fuente() en R, me sale el siguiente error:

> 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' 

Cualquier ayuda que puede ofrecer en la solución y me ayuda a entender lo que está pasando aquí sería ser muy apreciado.

> 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 

y

> l10n_info() 
$MBCS 
[1] FALSE 

$`UTF-8` 
[1] FALSE 

$`Latin-1` 
[1] TRUE 

$codepage 
[1] 1252 
+1

Bueno, parece que funciona bien aquí. Ejecuto Linux con una configuración regional UTF-8. Tal vez el problema proviene de la configuración regional de su sistema. ¿Intentó cambiarlo a uno UTF-8? – juba

+0

También funciona en MacOS 10.6.6. – ayman

+0

@juba ¿Qué debo hacer para cambiar R en Windows a un local UTF-8? –

Respuesta

19

Hablamos mucho de esto en los comentarios a mi publicación anterior, pero no quiero que esto se pierda en la página 3 de comentarios: tiene que establecer la configuración regional, funciona con ambas entradas desde la consola R (ver captura de pantalla en los comentarios), así como con el aporte de archivo, ver captura de pantalla:

El archivo "myfile.r" contiene:

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

La consola contiene:

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

Tenga en cuenta que el archivo entra falla y apunta al mismo carácter que el error del cartel original (el que está después de "R"). No puedo hacer esto con chino porque tendría que instalar "Microsoft Pinyin IME 3".0 ", pero el proceso es el mismo, simplemente reemplace la configuración regional con" chino "(la nomenclatura es un poco inconsistente, consulte la documentación).

+1

Muchas gracias, ¡funcionó! Usé Sys.setlocale ("LC_CTYPE", "chino") –

+1

En cualquier momento, señor. ("chino" no "chino", es interesante lo inconsistentes que son buenos, lo descubrió) –

+1

Confirmación: http://img257.imageshack.us/img257/7519/capturefru.jpg –

1

en Windows, cuando se copia-pegar un Unicode o UTF-8 cadena codificada en un control de texto que se establece en un solo byte de entrada (ascii ... dependiendo de la localidad), los bytes desconocidos serán reemplazados por questionmarks. Si tomo los primeros 4 caracteres de su cadena y la copio y pego en, p. Ej. Bloc de notas y guardarlo, el archivo se convierte en hexadecimal:

52 3F 3F 3F 3F

lo que tiene que hacer es encontrar un editor que se puede establecer a UTF-8 antes copiar y pegar el texto en él, entonces el salvado presentar (de sus primeros 4 caracteres) se convierte en:

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

Esto entonces será reconocido como UTF-8 válido por [R].

He usado "Notepad2" para probar esto, pero estoy seguro de que hay muchos más.

+0

Acabo de probar WinEdt (para el que hay un R-Plugin RWinEdt de uso frecuente) y no funciona (Versión 5.5). Por lo tanto, es posible que desee probarlo primero con "Notepad2". También puede escribir el archivo de texto utf-8 usando [R] writeChar(), creo que usa la codificación que estableció en Sys.setlocale(). –

+0

No importa qué editor de texto escriba el archivo, todos pueden escribir el archivo correctamente, R en Windows simplemente no lo lee. –

+0

@David Heffernan El problema que está teniendo el póster original es diferente al suyo. Sí, R puede leer archivos UTF-8 pero la forma en que su editor está configurado ni siquiera crea un archivo UTF-8. Utiliza un editor que no está configurado en Utf-8-Mode y, por lo tanto, si copia "R 同时 也" en él, el archivo se convierte en los bytes [52 3F 3F 3F] "R ???". –

3

Creo que el problema está en R. Puedo felizmente obtener archivos UTF-8 o UCS-2LE con muchos caracteres que no sean ASCII. Pero algunos caracteres hacen que falle. Por ejemplo, el siguiente

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á bien tanto en UTF-8 como en UCS-2LE sin la línea rusa. Pero si eso está incluido, entonces falla. Estoy señalando con el dedo a R. Tu texto chino también parece ser demasiado difícil para R en Windows.

La configuración regional parece irrelevante aquí. Es solo un archivo, usted le dice qué es la codificación del archivo, ¿por qué debería importar su ubicación?

+0

Voy a publicar mi pregunta en la lista de ayuda de R oficial, por si acaso es un error de R en Windows. –

21

En R/Windows, source tiene problemas con cualquier UTF-8 caracteres que no se pueden representar en la configuración regional actual (o página de códigos ANSI en Windows-speak). Desafortunadamente, Windows no tiene UTF-8 disponible como página de códigos ANSI: Windows tiene una limitación técnica que las páginas de códigos ANSI pueden solo deben ser codificaciones de uno o dos bytes por caracteres, no codificaciones de bytes variables como UTF-8.

Esto no parece ser un problema fundamental e irresoluble, simplemente hay un problema con la función source . Puede obtener el 90% del camino haciendo esto en su lugar:

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

Esto va a trabajar casi exactamente igual que source() con los argumentos por defecto, pero no le permitirá hacer eco = T, eval.print = T, etc.

+0

Confirmo que esto funciona. 'source()' requiere establecer 'Sys.setlocale()' a lo largo del archivo. 'eval' hace el trabajo sin este requisito. –

+5

'source' reenvía el argumento' encoding' a 'file', que, a su vez, convierte la entrada textual en la memoria a cualquier codificación locale especificada (y falla): este parece ser el culpable. 'parse' por el contrario no hace esto, lee el archivo como está y simplemente marca los bytes en la memoria con la codificación correcta. - No estoy del todo seguro de lo que esto nos dice, excepto que el manejo interno de las codificaciones de R es desordenado (ya lo sabíamos), y debería ser corregido, la compatibilidad con versiones anteriores sería condenada. –

5

Para mí (en Windows) que hago :

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

Funciona bien.

0

Me encuentro con este problema cuando trato de obtener un archivo .R que contenga algunos caracteres chinos. En mi caso, descubrí que simplemente establecer "LC_CTYPE" en "chino" no es suficiente. Pero ajustar "LC_ALL" a "chino" funciona bien.

Tenga en cuenta que no es suficiente para obtener la codificación correcta cuando lee o escribe un archivo de texto sin formato en Rstudio (o R?) Con no ASCII. La configuración regional también cuenta.

PS. el comando es Sys.setlocale (category = "LC_CTYPE", locale = "chinese"). Por favor, reemplace el valor de configuración regional correspondiente.

0

Construyendo en crow's answer, esta solución hace RStudioSource botón de trabajo.

Al golpear ese botón Source, RStudio ejecuta source('myfile.r', encoding = 'UTF-8')), de manera primordial source hace que los errores desaparecen y se ejecuta el código como se esperaba:

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