Tengo un archivo con una frase/términos de cada línea que leí a perl de STDIN. Tengo una lista de palabras vacías (como "á", "são", "é") y quiero comparar cada una de ellas con cada término, y eliminar si son iguales. El problema es que no estoy seguro del formato de codificación del archivo.Perl - Codificación de archivos y comparación de palabras
me sale esto desde el comando file
:
words.txt: Non-ISO extended-ASCII English text
Mi terminal de Linux está en UTF-8 y muestra el contenido correcto para algunas palabras y para otros no lo hacen. Aquí está la salida de algunos de ellos:
condi<E3>
conte<FA>dos
ajuda, mas não resolve
mo<E7>ambique
pedagógico são fenómenos
Se puede ver que los días 3 y 5 º líneas están identificando correctamente las palabras con acentos y caracteres especiales, mientras que otros no lo hacen. El resultado correcto para las otras líneas debería ser: condiã, conteúdos y moçambique.
si uso binmode(STDOUT, utf8)
las líneas "incorrectas" ahora emite correctamente, mientras que los otros no lo hacen. Por ejemplo, la 3ª línea:
ajuda, mas nà £ o determinación
¿Qué debo hacer chicos?
@ Michael Gracias ahora se ha emitir correctamente;) me di cuenta de que la mayor parte del archivo está en la norma ISO-8859-1 y algunas partes en UTF-8 (por eso algunos de ellos fueron dar salida correctamente) una más cosa. Tengo que usar la función 'lc' porque mis palabras vacías están en mayúsculas y tengo problemas cuando las frases no son utf-8. En estas situaciones, si tengo una letra mayúscula con un acento, no será inferior. – Barata
@Barata: Aún debe decodificar las cadenas que no sean UTF8 si quiere que 'uc' etc. trabaje en ellas. La característica 'Unicode_strings' de Perl 5.12 (y anterior) también puede ayudar, ya que asumirá ISO 8859-1 para cadenas de bytes. Compare: 'perl -e 'print uc (" \ xB5 \ xE9 \ xDF ")'' => 'μéß', ** que es incorrecto, ** con ' perl -M5.012 -e 'print uc ("\ xB5 \ xE9 \ xDF") ''=>' ΜÉSS' ** que es correcto. ** La última cadena es realmente '" \ x {39C} \ x {C9} SS "' o '" \ N { GRIEGO MAYÚSCULA LETRA MU} \ N {LETRA MAYÚSCULA L CON AGUDO} SS "'. La cadena original es '" \ N {MICRO SIGN} \ N {LETRA E MINÚSCULA LATINA CON AGUDO} \ N {LETRA PEQUEÑA LATINA SHARP S} "'. – tchrist
@tchrist ¿Es suficiente usar el código de Michael, verificar 'if $ @' y decodificar la cadena para iso-8859-1? – Barata