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.