2012-05-20 18 views
8

Estoy usando R 2.15.0 en Windows 7 de 64 bits. Me gustaría enviar texto Unicode (CJK) a un archivo.Salida de archivo UTF-8 en R

El código siguiente muestra cómo un carácter Unicode envió a escribir en una conexión de archivos UTF-8 no funciona como (I) que se espera:

rty <- file("test.txt",encoding="UTF-8") 
write("在", file=rty) 
close(rty) 
rty <- file("test.txt",encoding="UTF-8") 
scan(rty,what=character()) 
close(rty) 

Como se muestra por la salida de exploración:

Read 1 item 
[1] "<U+5728>" 

El archivo no se escribió con el carácter UTF en sí, sino con algún tipo de respaldo de conformidad con ANSI. ¿Puedo hacer que funcione bien la primera vez (es decir, con un archivo de texto que tiene "在" en su lugar), o puedo trabajar algo de magia extra para convertir la salida a Unicode con el carácter adecuado reemplazando la cadena de código?

Gracias.

[Más información: el mismo código se comporta correctamente en Cygwin, R 2.14.2, mientras que 2.14.2 en Win7 también está roto. Es esto en mi final en alguna parte?]

+0

[Actualización tardía] Los problemas tienden a ser * local * en lugar de codificación. He resuelto problemas de salida de galimatías cambiando temporalmente la configuración regional a algo "apropiado". Dios te ayudará si tienes datos de idiomas de más de un lugar. – Patrick

+0

tal vez este [post] (http://stackoverflow.com/questions/11069908/r-extracting-clean-utf-8-text-from-a-web-page-scraped-with-rcurl?lq=1) ayuda. – DJJ

Respuesta

8

países cadenas UTF-8 en archivo de texto:

kLogFileName <- "parser.log" 
log <- function(msg="") { 
    con <- file(kLogFileName, "a") 
    tryCatch({ 
    cat(iconv(msg, to="UTF-8"), file=con, sep="\n") 
    }, 
    finally = { 
    close(con) 
    }) 
} 
+0

¿Rompió esto en las versiones R más recientes? Cuando escribo archivos de esta manera, todavía tengo que establecer el parámetro de codificación de readLines en "ANSI" para obtener el contenido correcto del archivo. Un ejemplo es "à" que sale como "\ xe0" bajo la codificación UTF-8, pero correctamente bajo codificación ANSI cuando se usa readLines del archivo creado – dimpol

+0

@dimpol - ¿esto funcionó para usted al final? – Curious

+0

@Curious - No, terminé haciéndolo manualmente usando notepad ++.Solo tenía que hacerlo una vez para los archivos en un conjunto de datos y era más rápido simplemente morder la viñeta y hacerlo manualmente luego para seguir jugando con las codificaciones de archivos R. – dimpol

0

Creo que usted está teniendo problemas porque write se construye de modo que tome el nombre de un objeto y no parecen tener construir un objeto tan nombrado. Pruebe esto en su lugar:

txt <- "在" 
rty <- file("test.txt",encoding="UTF-8") 
write(txt, file=rty) 
close(rty) 
rty <- file("test.txt",encoding="UTF-8") 
inp <- scan(rty,what=character()) 
#Read 1 item 
close(rty) 
inp 
#[1] "在" 
+0

Hm, la aplicación original que inspiró el fragmento mínimo sobre los objetos nombrados usados. Además, el código que proporcionó anteriormente produce el mismo resultado para mí que el anterior. Tal vez tengo un problema de codificación nativa? – Patrick

0

Tengo un problema con las cadenas UTF-8 que provienen de DB.

La única manera que he encontrado para guardarlos correctamente es guardar el archivo en modo binario.

F <- file(file.name, "wb") 
    tryCatch({ 
    writeBin(charToRaw(the_utf8_str), F) 
    }, 
    finally = { 
    close(F) 
    }) 
9

El problema es debido a algún R en Windows comportamiento especial (utilizando la codificación por defecto del sistema/o el uso de algún sistema de escritura funciones; no sé los detalles, pero el comportamiento es realmente conocido)

Para escribir texto codificación UTF8 en Windows uno tiene que utilizar las opciones useBytes=T en funciones li ke writeLines o readLines:

txt <- "在" 
writeLines(txt, "test.txt", useBytes=T) 

readLines("test.txt", encoding="UTF-8") 
[1] "在" 
+0

¡Gracias! Esto funcionó para mí. Muchos consejos incompletos por ahí. – Ruben