Pregunta

Estoy en OS X 10.5.5 (aunque supongo que no importa mucho)

Tengo un conjunto de archivos de texto con caracteres sofisticados como comillas dobles, puntos suspensivos (" ... ") en un carácter, etc.

Necesito convertir estos archivos a ASCII de 7 bits sin formato, de preferencia, sin perder el significado de los caracteres (es decir, convertir esos puntos suspensivos en tres períodos, citas a las habituales, etc.).

Por favor, aconseja a alguna herramienta / script de línea de comando inteligente (bash) que haga eso.

¿Fue útil?

Solución

El navegador web Elinks convertirá las entidades Unicode a sus equivalentes ASCII, dando cosas como " " para " - " y "..." para " ... " ;, etc. Hay un módulo de python python-elinks que utiliza la misma tabla de conversión, y sería trivial convertirlo en un filtro de shell, como este:

#!/usr/bin/env python
import elinks
import sys
for line in sys.stdin:
    line = line.decode('utf-8')
    sys.stdout.write(line.encode('ASCII', 'elinks'))

Otros consejos

iconv debería hacerlo, por lo que sé. No estoy 100% seguro de cómo maneja las conversiones donde un carácter de entrada debería / podría convertirse en varios caracteres de salida, como con el ejemplo de puntos suspensivos ... ¡Algo para intentarlo!

Actualización: lo intenté, y parece que no funciona. Falla, posiblemente porque no sabe cómo expresar puntos suspensivos (el carácter de prueba que utilicé) en un '' más pequeño '' codificación La conversión de UTF-8 a UTF-16 salió bien. : / Aún así, podría valer la pena investigar más a fondo.

Echa un vistazo a las herramientas de transliteración; Me gusta Unidecode (en Perl) , y no es demasiado difícil de transferir a otros idiomas.

He utilizado iconv para convertir un archivo de UTF-16LE (little-endian como descubrí por prueba y error) que fue creado por TextPad en Windows a ASCII en OSX de esta manera:

 cat utf16file.txt |iconv -f UTF-16LE -t ASCII > asciifile.txt

También puede canalizar a través de hexdump para ver los caracteres y asegurarse de obtener la salida correcta, el terminal sabe cómo interpretar UTF-16 y lo muestra correctamente, por lo que no puede distinguir simplemente haciendo 'cat' en el archivo:

cat utf16file.txt | iconv -f UTF-16LE -t ASCII | hexdump -C 

Esto muestra el diseño con los códigos de caracteres hexadecimales y los caracteres ASCII a la derecha, y puede probar diferentes codificaciones en -f " desde " parámetro para averiguar a qué se enfrenta.

Use 'iconv -l' para enumerar los conjuntos de caracteres que iconv puede usar en su sistema.

Hubo una pregunta ayer o el día anterior acerca del cambio de nombre del archivo, y mostré un script de Perl rename.pl que se podría utilizar para la tarea. El área del problema es saber cómo se codifican los caracteres impares y diseñar la secuencia correcta de transliteraciones. Probablemente lo haría con una adaptación de ese script que hizo secuencialmente todas las asignaciones. Hacerlo un personaje a la vez sería demasiado complicado.

La pregunta fue: Cómo cambiar el nombre con prefijo / sufijo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top