Convertir codificación de archivo de texto

15

Con frecuencia encuentro archivos de texto (como archivos de subtítulos en mi idioma nativo, persa ) con problemas de codificación de caracteres. Estos archivos se crean en Windows y se guardan con una codificación inadecuada (parece ser ANSI), que parece incoherente e ilegible, así:

ingrese la descripción de la imagen aquí

En Windows, se puede solucionar esto fácilmente usando Notepad ++ para convertir la codificación a UTF-8, como a continuación:

ingrese la descripción de la imagen aquí

Y el resultado legible correcto es así:

ingrese la descripción de la imagen aquí

He buscado mucho una solución similar en GNU / Linux, pero desafortunadamente las soluciones sugeridas (por ejemplo, esta pregunta ) no funcionan. Sobre todo, he visto a personas sugerir iconvy recodeno he tenido suerte con estas herramientas. He probado muchos comandos, incluidos los siguientes, y todos han fallado:

$ recode ISO-8859-15..UTF8 file.txt
$ iconv -f ISO8859-15 -t UTF-8 file.txt > out.txt
$ iconv -f WINDOWS-1252 -t UTF-8 file.txt > out.txt 

¡Ninguno de estos funcionó!

Estoy usando Ubuntu-14.04 y estoy buscando una solución simple (ya sea GUI o CLI) que funcione igual que Notepad ++.

Un aspecto importante de ser "simple" es que no se requiere que el usuario determine la codificación de origen; más bien, la herramienta debería detectar automáticamente la codificación de origen y solo el usuario debería proporcionar la codificación de destino. Sin embargo, también me alegrará saber acerca de una solución de trabajo que requiera que se proporcione la codificación de origen.

Si alguien necesita un caso de prueba para examinar diferentes soluciones, se puede acceder al ejemplo anterior a través de este enlace .

Seyed Mohammad
fuente
2
Proveedores: vim '+set fileencoding=utf-8' '+wq' file.txt.
muru
Farsi debería ser iso-639, pero eso no parece estar disponible, ya sea en iconvo recode. Al menos, no lo veo en la salida de iconv -l.
terdon
@muru probé tu sugerencia vimpero no funcionó.
Seyed Mohammad
@SeyedMohammad todavía se veía igual?
muru
@muru Yup! Ningún cambio.
Seyed Mohammad

Respuestas:

12

Estos archivos de Windows con texto persa están codificados en Windows-1256 . Por lo tanto, se puede descifrar mediante un comando similar a OP probado, pero con diferentes conjuntos de caracteres. A saber:

recode Windows-1256..UTF-8 <Windows_file.txt > UTF8_file.txt
(denunciado por las quejas del póster original; ver comentarios)

iconv -f Windows-1256 Windows_file.txt > UTF8_file.txt

Éste supone que la variable de entorno LANG está configurada en un entorno local UTF-8. Para convertir a cualquier codificación (UTF-8 o de otro modo), independientemente de la configuración regional actual, se puede decir:

iconv -f Windows-1256 Windows_file.txt -t ${output_encoding} > ${output_file}

El póster original también se confunde con las herramientas semánticas de recodificación de texto (recodificación, iconv). Para la codificación de origen ( fuente.. o -f) se debe especificar la codificación con la que se guarda el archivo (por el programa que lo creó). No algunas conjeturas (ingenuas) basadas en caracteres mojibake en programas que intentan (pero fallan) leerlo. Intentar con ISO-8859-15 o WINDOWS-1252 para un texto persa fue obviamente un callejón sin salida: estas codificaciones simplemente no contienen ninguna letra persa.

Incnis Mrsi
fuente
@Seyed Mohammad: ahora con comandos especificados explícitamente.
Incnis Mrsi
¡Gracias! El segundo comando (el que usa iconv) funcionó. Pero el primero (usando recode) no funcionó correctamente y la salida aún era un galimatías. Edite su respuesta para incluir solo el iconvcomando y lo marcaré como la respuesta.
Seyed Mohammad
1
También para estar libre de la configuración de la variable LANG, uno puede hacer: iconv -f WINDOWS-1256 -t UTF-8 in.txt > out.txtlo que probé y trabajé. Por lo tanto, puede ser una buena idea editar su comando de esta manera.
Seyed Mohammad
Escribí un script útil basado en el comando de trabajo que he explicado en otra respuesta aquí. Espero que ayude a otros usuarios persas de Linux, ya que me ayuda mucho.
Seyed Mohammad
@karel: Gracias, "quejarse" es un verbo, la frase fue escrita de manera no gramatical.
Incnis Mrsi
1

Además de iconv, que es una herramienta muy útil por sí sola o en un script, hay una solución realmente simple que encontré tratando de resolver el mismo problema para los charsets griegos (Windows-1253 + ISO-8859-7).

Todo lo que necesita hacer es abrir el archivo de texto a través del cuadro de diálogo "Abrir" de Gedit y no haciendo doble clic en él . En la parte inferior del cuadro de diálogo hay un menú desplegable para Codificación, que se establece en "Detectado automáticamente" . Cámbielo a "Windows-125x" u otro conjunto de códigos adecuado y el texto será perfectamente legible en Gedit. Luego puede guardarlo usando la codificación UTF-8, solo para asegurarse de que no volverá a tener el mismo problema en el futuro ...

Giorgos_tph
fuente
1

Como solución complementaria al problema, he preparado un útil script Bash basado en el iconvcomando de la respuesta de Incnis Mrsi :

#!/bin/bash

if [ $# -lt 1 ]
then
   echo 'Specify at least one file to fix.'
   exit 1
fi

# Temp file to store conversion attempt(s).
tmp='tmp.fixed'

for file in "$@"
do
  # Try to fix the file encoding.
  if iconv -f WINDOWS-1256 "$file" -t UTF-8 > $tmp; then
    echo "Fixed: '$file'"
    cat $tmp > "$file"
  else
    echo "Failed to fix: '$file'"
  fi
done
rm $tmp

Guarde este script como fix-encoding.sh, déle permiso de ejecución usando chmod +x fix-encoding.shy úselo de esta manera:

./fix-encoding.sh myfile.txt my2ndfile.srt my3rdfile.sub

Este script intentará corregir la codificación de cualquier número de archivos que se proporcionan como entrada. Tenga en cuenta que los archivos se corregirán en el lugar, por lo que se sobrescribirán los contenidos.

Seyed Mohammad
fuente
No necesita poner $ file fuera de "  ...  " ya que las variables se expanden entre comillas dobles y en texto abierto. Solo '$ file' se representará literalmente, con signo de dólar, por bash.
Incnis Mrsi
Como mencioné en respuesta a la respuesta publicada por 'Incnis Mrsi', esa solución no funcionó y este script también.
Seyed Mohammad
1

No sé si esto funciona con Farsi: uso Gedit, falla con la codificación incorrecta, y puedo elegir lo que quiero traducir a UTF-8, era solo formato de texto no iluminado, pero aquí hay una captura de pantalla !

ingrese la descripción de la imagen aquí

Lo siento, finalmente pude leer mis archivos de texto, así que ahora están todos convertidos.

También me encantó notepad ++, todavía lo extraño.

Ken Mollerup
fuente
Gedit no puede solucionar el problema. Aunque Gedit no muestra un error de codificación para mi archivo, incluso cuando lo hace no puede solucionarlo. También he intentado "guardar como" con la codificación UTF-8 en Gedit, pero no soluciona el problema.
Seyed Mohammad
1

Si te gusta trabajar en GUI en lugar de CLI, como a mí me gusta:

  1. Abrir archivo con Geany (editor)
  2. Vaya al menú Archivo -> Volver a cargar como
  3. Elija la codificación supuesta para cambiar el galimatías en caracteres identificables en su idioma. Por ejemplo, para leer submarinos griegos, volvería a cargar como Europa occidental -> Griego (Windows-1253)
  4. Vaya al menú Documento > Establecer codificación -> Unicode -> UTF-8
  5. Salvar
Christos
fuente
No funciona ..
Aurimas
0

La solución de trabajo que encontré es usar el editor de texto de Microsoft Visual Studio Code , que es gratuito y está disponible para Linux.

Abra el archivo que desea convertir su codificación en VS-Code. En la parte inferior de la ventana, hay algunos botones. Uno de ellos está relacionado con la codificación del archivo, como se muestra a continuación:

ingrese la descripción de la imagen aquí

Al hacer clic en este botón, aparece un menú superior que incluye dos elementos. Desde este menú, seleccione la opción "Reabrir con codificación", como se muestra a continuación:

ingrese la descripción de la imagen aquí

Esto abrirá otro menú que incluye una lista de diferentes codificaciones, como se muestra a continuación. Ahora seleccione "Árabe (Windows 1256)":

ingrese la descripción de la imagen aquí

Esto arreglará el texto de galimatías así:

ingrese la descripción de la imagen aquí

Ahora haga clic en el botón de codificación nuevamente y esta vez seleccione la opción "Guardar con codificación", como se muestra a continuación:

ingrese la descripción de la imagen aquí

Y en el nuevo menú, seleccione la opción "UTF-8":

ingrese la descripción de la imagen aquí

Esto guardará el archivo corregido usando la codificación UTF-8:

ingrese la descripción de la imagen aquí

¡Hecho! :)

Seyed Mohammad
fuente
Intenté "Guardar con codificación" pero muestra una codificación anterior, en mi caso es UTF8
chaitanya