2012-06-27 8 views
11

tengo una cadena como la siguiente:datos de escritura no es la preservación de codificación

str <- "ていただけるなら" 
Encoding(str) #returns "UTF-8" 

lo escribo en el disco:

write.table(str, file="chartest", quote=F, col.names=F, row.names=F) 

Ahora miro el archivo en Notepadd ++, que se establece a UTF-8 sin codificación BOM, y entiendo esto:

<U+3066><U+3044><U+305F><U+3060><U+3051><U+308B><U+306A><U+3089> 

¿Qué está mal en este proceso? Me gustaría que el archivo texto escrito para mostrar la cadena tal como aparece en R.

Esto es en Windows 7, la versión R 2.15

Respuesta

1

¿Ha intentado utilizar el argumento fileEncoding?

write.table(str, file="chartest", quote=F, col.names=F, row.names=F, fileEncoding="UTF-8") 
+1

Gracias por la sugerencia. Sin embargo, intentar eso no parece funcionar. – qua

+0

OK, entonces, en el momento en que lo probé en mi computadora de trabajo (en Mac OSX) funcionó, pero desde entonces probé en la computadora de mi casa (Windows 7) y no fue así. – plannapus

13

Esta es una molesta "característica" de R en Windows. La única solución que he encontrado hasta ahora es cambiar temporal y programáticamente su configuración regional a la apropiada necesaria para decodificar el script del texto en cuestión. Entonces, en el caso anterior, usaría la configuración regional japonesa.

## This won't work on Windows 
str <- "ていただけるなら" 
Encoding(str) #returns "UTF-8" 
write.table(str, file="c:/chartest.txt", quote=F, col.names=F, row.names=F) 
## The following should work on Windows - first grab and save your existing locale 
print(Sys.getlocale(category = "LC_CTYPE")) 
original_ctype <- Sys.getlocale(category = "LC_CTYPE") 
## Switch to the appropriate local for the script 
Sys.setlocale("LC_CTYPE","japanese") 
## Now you can write your text out and have it look as you would expect 
write.table(str, "c:/chartest2.txt", quote = FALSE, col.names = FALSE, 
      row.names = FALSE, sep = "\t", fileEncoding = "UTF-8") 
## ...and don't forget to switch back 
Sys.setlocale("LC_CTYPE", original_ctype) 

Lo anterior produce los dos archivos que puede ver en esta captura de pantalla. El primer archivo muestra los puntos de código Unicode, que no es lo que quieres, mientras que el segundo muestra los glifos que normalmente esperarías.

Japanese text

Hasta el momento nadie ha sido capaz de explicarme por qué sucede esto en R. No es una característica inevitable de Windows porque Perl, como menciono en this puesto, se pone alrededor de la cuestión de alguna manera.

+0

Gracias por su respuesta. El japonés fue solo un ejemplo, me gustaría algo que funcione para todos los tipos de idiomas. Aunque no suena tan prometedor. – qua

+0

@qua - Sí, pensé que podría ser un ejemplo al azar dado que rompiste la cuerda japonesa en un lugar bastante extraño. Lamentablemente, en este momento no creo que exista una mejor solución para R, pero crea tu propia respuesta a esta pregunta si encuentras una. Estoy de acuerdo en que si no conoces el guión de antemano, podrías tener problemas con mi enfoque porque (entre otros problemas) requeriría que adivines el guión que se está usando y simplemente no hay una forma segura de establecer el tipo de codificación. – SlowLearner

+0

@SlowLearner ¿Hay alguna manera de enumerar todos los valores válidos para LC_CTYPE? – panterasBox

Cuestiones relacionadas