1 votos

¿Cómo puedo resaltar o procesar caracteres Unicode al pegar en aplicaciones de Terminal desde PDFs?

A veces copio scripts de una sola línea en la terminal desde archivos PDF. Como son copiados de PDFs, a veces contienen caracteres "sospechosos", como espacios no rompibles o caracteres no ASCII difíciles.

Me gustaría manejar esto de manera eficiente si es posible.

¿Se pueden cambiar de forma segura o al menos resaltar al pegar un fragmento de línea de comando en Terminal.app o iTerm2.app?

4voto

Joel Puntos 112

PRÓLOGO:

La pregunta anterior fue eliminada por el OP mientras estaba trabajando en la siguiente respuesta. No me gustan los esfuerzos desperdiciados, así que logré copiar la pregunta original del OP y pegarla en la "nueva pregunta" de arriba. Sí... esto es un poco extraño :)


Creo que lo que estás buscando es una utilidad de línea de comandos llamada iconv. Inconveniente, iconv requiere declaraciones de argumentos "desde" y "hacia" (ver man iconv) del tipo de codificación (por ejemplo, UTF-8, ascii, unicode, etc)... y que yo sepa, "shady" no es un tipo de codificación reconocido :) Sin embargo, el tipo de codificación puede determinarse a partir de otra utilidad de línea de comandos llamada file. Todavía más inconveniente, tanto iconv como file especifican que la entrada debe estar contenida en un archivo :/

Tu pregunta me intrigó, ya que parece algo razonable de hacer; es decir, C&P (copiar y pegar) de PDF a CLI. Así que pasé unos minutos peleando con iconv y file para obtener la siguiente respuesta; una respuesta que no requiere que copies y pegues tus cadenas de PDF en un archivo. <advertencia> Esto funciona en mi Ventura Mac bajo zsh, pero no ha sido probado en ningún otro lugar.</advertencia>

No has proporcionado un ejemplo, y no pude encontrar ningún código de PDF defectuoso en una búsqueda breve. Así que, en su lugar, encontré esta cadena en un PDF en francés sobre programación en Python:

print("Numéro de boucle", i)

Así que primero necesitamos pasar esta cadena por file para determinar la codificación (nota el uso del "guión" -: una referencia a stdin en lugar de un nombre de archivo correcto):

echo "print("Numéro de boucle", i)" | file -
/dev/stdin: texto Unicode, texto UTF-8

Entonces, la cadena estaba codificada en UTF-8. Ahora vamos a convertir la cadena a ASCII desde UTF-8 usando iconv:

<strong>NOTA:</strong> La opción <code>//translit</code> no está mencionada en la versión de macOS de <code>man iconv</code>, pero aún funciona (!). Se usa como una bandera para indicar a <code>iconv</code> que <em>translitera</em> la salida a la línea de comandos. Otra opción es <em>ignorar</em> el/los caracter(es) <em>no ascii</em>: <code>//ignore</code>

echo "print("Numéro de boucle", i)" | iconv -f utf-8 -t ascii//translit
print(Num'ero de boucle, i)

Y así te podrías estar preguntando, "¿Por qué agregó el caracter adicional '?". Esa es una buena pregunta, y tal vez la respuesta esté aquí. Apple podría estar usando utf-8-mac en lugar de utf-8. ¡Lo cual supongo estaría bien si se hubieran molestado en reflejar eso en su implementación de iconv! De hecho, hay una codificación UTF8-MAC listada en la salida de iconv --list - pero no mejora la transliteración:

echo 'print("Numéro de boucle", i)' | iconv -f utf8-mac -t ascii//translit
print("Num'ero de boucle", i)  

echo 'print('Numéro de boucle', i)' | iconv -f utf-8-mac -t ascii//translit
print(Num'ero de boucle, i)

Como está escrito, la utilidad iconv para macOS Ventura no puede convertir correctamente todos los caracteres utf-8 a ASCII. Convierte los que puede, e emite un error (o inserta caracteres inapropiados) para los demás. Para obtener un "mejor esfuerzo" de iconv puedes agregar la opción -c, haciendo que iconv simplemente elimine los caracteres que no puede convertir.

Como experimento: Si tienes a mano una caja de Linux razonablemente actual, puedes probar iconv con la frase de ejemplo aquí. Cuando lo intenté en mis sistemas Linux (dos versiones de Debian; 'bookworm' y 'bullseye'), encontré que iconv hizo una 'transliteración' perfectamente correcta del ejemplo usado en esta respuesta (y varios otros); es decir, no añadió ningún caracter extra '.

Estos resultados podrían mejorarse con un "filtro" de sed:

echo 'print("Numéro de boucle", i)' | iconv -f utf-8 -t ascii//translit | sed 's/[^a-zA-Z 0-9 , ( )]//g'

Pero tener que usar sed para complementar iconv me parece un truco feo - uno que debería ser innecesario.

Y así, iconv parece funcionar al menos algunas veces en macOS... espero que esto ayude.

0voto

WGroleau Puntos 255

Otras opciones:

Si sabes qué caracteres están causando problemas, puedes usar perl o tr u otros para convertir esos caracteres específicos.

Si pegas el texto en un documento de LibreOffice Writer, un espacio no separable se sombreará de color gris claro. (¡Ahora tienes un carácter sombrío!)

Si pegas el texto en una imagen, un programa OCR puede convertirlo de nuevo en un archivo de texto. tesseract es uno decente y gratuito, pero hay otros tanto gratuitos como de pago. La ventaja de este método es que se basa en lo que parece y es ajeno a las codificaciones realmente extrañas que ocasionalmente se encuentran en archivos PDF.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X