Convirtiendo una cadena de Unicode escapada a ASCII

Después de leer todo sobre iconv y Encoding , todavía estoy confundido.

Estoy raspando el origen de una página web Tengo una cadena que se ve así: 'pretty\u003D\u003Ebig' (que se muestra en la consola R como 'pretty\\\u003D\\\u003Ebig' ). Quiero convertir esto en la cadena ASCII, que debería ser 'pretty=>big' .

Más simplemente, si configuro

 x <- 'pretty\\u003D\\u003Ebig' 

¿Cómo realizo una conversión en x para obtener pretty=>big ?

¿Alguna sugerencia?

Utilice el análisis sintáctico, pero no evalúe los resultados:

 x1 <- 'pretty\\u003D\\u003Ebig' x2 <- parse(text = paste0("'", x1, "'")) x3 <- x2[[1]] x3 # [1] "pretty=>big" is.character(x3) # [1] TRUE length(x3) # [1] 1 

Aunque he aceptado la respuesta de Hong ooi, no puedo evitar pensar que el parse y la eval es una solución de peso pesado. Además, como se señaló, no es seguro, aunque para mi aplicación puedo estar seguro de que no recibiré citas peligrosas.

Entonces, he ideado un enfoque alternativo, algo brutal,

 udecode <- function(string){ uconv <- function(chars) intToUtf8(strtoi(chars, 16L)) ufilter <- function(string) { if (substr(string, 1, 1)=="|") uconv(substr(string, 2, 5)) else string } string <- gsub("\\\\u([[:xdigit:]]{4})", ",|\\1,", string, perl=TRUE) strings <- unlist(strsplit(string, ",")) string <- paste(sapply(strings, ufilter), collapse='') return(string) } 

Cualquier simplificación bienvenida!

Con el paquete de stringi :

 > x <- 'pretty\\u003D\\u003Ebig' > stringi::stri_unescape_unicode(x) [1] "pretty=>big" 

Un uso para eval(parse) !

 eval(parse(text=paste0("'", x, "'"))) 

Esto tiene sus propios problemas, por supuesto, como tener que escapar manualmente cualquier comilla dentro de la cadena. Pero debería funcionar para cualquier secuencia Unicode válida que pueda aparecer.

Yo simpatizo; He luchado con R y el texto Unicode en el pasado y no siempre con éxito. Si sus datos están en x , primero intente un reemplazo global, algo como esto:

 x <- gsub("\u003D", "=>", x) 

A veces uso una construcción como

 lapply(x, utf8ToInt) 

para ver dónde están los puntos de código alto, p. ej., cualquier valor superior a 150. Esto me ayuda a localizar problemas causados ​​por espacios sin interrupción, por ejemplo, que parecen aparecer cada tanto.

 > iconv('pretty\u003D\u003Ebig', "UTF-8", "ASCII") [1] "pretty=>big" 

pero pareces tener un escape extra

El truco aquí es que '\\u003D' es en realidad 6 caracteres mientras que usted quiere '\u003D' que es solo un caracter. El truco adicional es que para que coincida con esas barras invertidas, necesita utilizar barras diagonales inversas doblemente escapadas en el patrón:

 gsub("\\\\u003D\\\\u003E", "\u003D\u003E", x) #[1] "pretty=>big" 

Para reemplazar varios personajes con un personaje, debe orientar el patrón completo. No puedes simplemente eliminar una barra invertida. (Dado que ha indicado que este es un problema más general, creo que la respuesta podría estar en modificaciones a su método aún no descrito para descargar este texto).

Cuando cargo sus funciones y las dependencias, este código funciona:

 > freq <- ngram(c('pretty\u003D\u003Ebig'), year_start = 1950) > > str(freq) 'data.frame': 59 obs. of 4 variables: $ Year : num 1950 1951 1952 1953 1954 ... $ Phrase : Factor w/ 1 level "pretty=>big": 1 1 1 1 1 1 1 1 1 1 ... $ Frequency: num 1.52e-10 6.03e-10 5.98e-10 8.27e-10 8.13e-10 ... $ Corpus : Factor w/ 1 level "eng_2012": 1 1 1 1 1 1 1 1 1 1 ... 

(Así que supongo que todavía no tengo claro el caso de uso).

Intereting Posts