Cómo eliminar caracteres que no sean UTF-8 del archivo de texto

84

Tengo un montón de archivos en árabe, inglés y ruso que están codificados en utf-8. Al intentar procesar estos archivos usando un script de Perl, aparece este error:

Malformed UTF-8 character (fatal)

Verificando manualmente el contenido de estos archivos, encontré algunos caracteres extraños en ellos. Ahora estoy buscando una forma de eliminar automáticamente estos caracteres de los archivos.

¿Hay alguna forma de hacerlo?

Hakim
fuente
2
Tal vez sea lo mismo que esto: stackoverflow.com/questions/7656283/…
Olaf Dietsche
4
¿Qué son los caracteres que no son UTF-8? ¡Todos los caracteres de una cadena UTF-8 bien formada son caracteres UTF-8 (en realidad Unicode)! Algunos de ellos están codificados en UTF-8 en varios bytes consecutivos ....
Basile Starynkevitch
3
@BasileStarynkevitch: el mensaje de error indica claramente que hay un carácter UTF-8 mal formado. Eso significa que apareció un byte que no puede aparecer como parte de un archivo UTF-8 válido. Eso no es difícil; podría ser un byte 0xC0 o 0xC1, o 0xF5..0xFF, o un problema de secuenciación con bytes que de otro modo serían válidos.
Jonathan Leffler

Respuestas:

156

Este comando:

iconv -f utf-8 -t utf-8 -c file.txt

limpiará su archivo UTF-8, omitiendo todos los caracteres no válidos.

-f is the source format
-t the target format
-c skips any invalid sequence
Palantir
fuente
11
"iconv -f utf-8 -t utf-8 -c file.txt" en una Mac. guión entre 'f' y '8'
Colin
1
Convenientemente puede transformar el contenido del portapapeles en un Mac hacerlo: pbpaste | iconv -f utf-8 -t -utf-8 -c | pbcopy. También creé un flujo de trabajo de Alfred con un atajo global para eliminar todos los caracteres especiales mediante la orientación ascii.
Lenar Hoyt
1
Esto produjo un archivo que estaba completamente en blanco para mí. Solo quiero que todos sepan que esto es potencialmente destructivo y hacer una copia de seguridad de su archivo antes de ejecutarlo.
Counterbeing
5
iconv -f utf-8 -t ascii//TRANSLITresolvió mi problema. Convierte comillas rizadas en comillas rectas.
Coronel Panic
5
-opara un archivo de salida diferente
codaamok
0

Su método debe leer byte a byte y comprender y apreciar completamente la construcción inteligente de los caracteres. El método más simple es utilizar un editor que leerá cualquier cosa, pero solo generará caracteres UTF-8. Textpad es una opción.

Charles KnNell
fuente
iconv no está disponible en cygwin. ¿Hay alguna forma de hacer esto en windows / cygwin? Tengo un archivo XML grande (más de 100000 líneas) que necesita eliminar los caracteres no válidos. No me importa el utf-8 válido. Configuré notepad ++ en utf-8, pero incluso después de guardarlo desde allí, todavía recibo errores en el analizador XML
mljm
ubuntu WSL en Windows viene con iconv
Kat Lim Ruiz
-4
cat foo.txt | strings -n 8 > bar.txt

hará el trabajo.

atul jha
fuente
10
No, esto también eliminará muchos caracteres utf-8 válidos.
Zack Burt