¿La mejor manera de convertir archivos de texto entre juegos de caracteres?

526

¿Cuál es la herramienta o método más rápido y fácil para convertir archivos de texto entre conjuntos de caracteres?

Específicamente, necesito convertir de UTF-8 a ISO-8859-15 y viceversa.

Todo vale: frases en su lenguaje de programación favorito, herramientas de línea de comandos u otras utilidades para SO, sitios web, etc.

Las mejores soluciones hasta ahora:

En Linux / UNIX / OS X / cygwin:

  • El ícono de Gnu sugerido por Troels Arvin se usa mejor como filtro . Parece estar universalmente disponible. Ejemplo:

    $ iconv -f UTF-8 -t ISO-8859-15 in.txt > out.txt
    

    Como señaló Ben , hay un convertidor en línea que usa iconv .

  • Gnu recode ( manual ) sugerido por Cheekysoft convertirá uno o varios archivos en el lugar . Ejemplo:

    $ recode UTF8..ISO-8859-15 in.txt
    

    Este usa alias más cortos:

    $ recode utf8..l9 in.txt
    

    Recode también admite superficies que se pueden usar para convertir entre diferentes tipos de terminación de línea y codificaciones:

    Convierta nuevas líneas de LF (Unix) a CR-LF (DOS):

    $ recode ../CR-LF in.txt
    

    Archivo de codificación Base64:

    $ recode ../Base64 in.txt
    

    También puedes combinarlos.

    Convierta un archivo UTF8 codificado en Base64 con terminaciones de línea Unix a un archivo Latin 1 codificado en Base64 con terminaciones de línea Dos:

    $ recode utf8/Base64..l1/CR-LF/Base64 file.txt
    

En Windows con Powershell ( Jay Bazuzi ):

  • PS C:\> gc -en utf8 in.txt | Out-File -en ascii out.txt

    (Sin embargo, no es compatible con ISO-8859-15; dice que los charsets compatibles son unicode, utf7, utf8, utf32, ascii, bigendianunicode, default y oem).

Editar

¿Te refieres al soporte iso-8859-1? Usar "String" hace esto, por ejemplo, viceversa.

gc -en string in.txt | Out-File -en utf8 out.txt

Nota: Los posibles valores de enumeración son "Desconocido, Cadena, Unicode, Byte, BigEndianUnicode, UTF8, UTF7, Ascii".

Antti Sykäri
fuente
Lo intenté gc -en Ascii readme.html | Out-File -en UTF8 readme.htmlpero convierte el archivo a utf-8 pero luego está vacío. Notepad ++ dice que el archivo tiene formato Ansi, pero leerlo como lo entiendo, ¿eso ni siquiera es un juego de caracteres válido? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
OZZIE
2
Simplemente encuentre esto en busca de una respuesta a una pregunta relacionada: ¡excelente resumen! Solo pensé que valía la pena agregar que recodetambién actuará como filtro si no le pasa ningún nombre de archivo, por ejemplo:recode utf8..l9 < in.txt > out.txt
Jez
¿iconv.com/iconv.htm parece estar muerto para mí? (tiempo de espera)
Andrew Newby
2
Si usa enca, no necesita especificar la codificación de entrada. A menudo es suficiente con especificar el idioma: enca -L ru -x utf8 FILE.TXT.
Alexander Pozdneev
1
En realidad, iconv funcionó mucho mejor como un convertidor in situ en lugar de un filtro. La conversión de un archivo con más de 2 millones de líneas usando iconv -f UTF-32 -t UTF-8 input.csv > output.csvsolo se guardó setecientas mil líneas, solo un tercio. El uso de la versión in situ iconv -f UTF-32 -t UTF-8 file.csvconvirtió con éxito las más de 2 millones de líneas.
Nicolay77

Respuestas:

246

Enfoque de utilidad independiente

iconv -f ISO-8859-1 -t UTF-8 in.txt > out.txt
-f ENCODING  the encoding of the input
-t ENCODING  the encoding of the output

No tiene que especificar ninguno de estos argumentos. Se establecerán de manera predeterminada en su ubicación actual, que generalmente es UTF-8.

Troels Arvin
fuente
44
Para cualquier otra persona que esté tropezando con las versiones que no están en el tablero que no están disponibles, parece que las versiones OSX (y posiblemente todas las BSD) de iconv no admiten los alias sin tablero para las diversas codificaciones UTF- *. iconv -l | grep UTFle dirá todas las codificaciones relacionadas con UTF que admite su copia de iconv.
coredumperror
14
¿No conoce la codificación de su archivo de entrada? Úselo chardet in.txtpara generar una mejor suposición. El resultado puede usarse como CODIFICACIÓN en iconv -f ENCODING.
Estofado
44
Impedir la salida en caracteres no válidos (evitando illegal input sequence at positionmensajes), y reemplazar los caracteres "extraños" con caracteres "similares": iconv -c -f UTF-8 -t ISO-8859-1//TRANSLIT in.txt > out.txt.
knb
Me gusta esto porque es estándar en la mayoría de las plataformas NIX. Sino también ver la opción de comando VIM (alias: ex) a continuación . Información adicional: (1) usted (probablemente) no necesita especificar la -fopción (desde) con iconv. (2) el file --mime-encoding <file/s>comando puede ayudarlo a descubrir la codificación en primer lugar.
viernes
1
FWIW el filecomando informó mi fuente como UTF-16 Little Endian; ejecutar lo iconv -f UTF-16 -t UTF-8...transformó incorrectamente a ASCII, tuve que especificar explícitamente la iconv -f UTF-16LE...salida UTF-8
Platón
90

Prueba VIM

Si usted tiene vim puedes usar esto:

No probado para cada codificación.

Lo bueno de esto es que no tienes que saber la codificación de origen

vim +"set nobomb | set fenc=utf8 | x" filename.txt

Tenga en cuenta que este comando modifica directamente el archivo


Explicación parte!

  1. +: Utilizado por vim para ingresar directamente el comando al abrir un archivo. Usualmente se usa para abrir un archivo en una línea específica:vim +14 file.txt
  2. |: Separador de múltiples comandos (como ;en bash)
  3. set nobomb : sin utf-8 BOM
  4. set fenc=utf8: Establece una nueva codificación en el enlace de documento utf-8
  5. x : Guardar y cerrar archivo
  6. filename.txt : ruta al archivo
  7. ": qotes están aquí debido a las tuberías. (de lo contrario, bash los usará como tubería de bash)
Boop
fuente
Bastante fresco, pero algo lento. ¿Hay alguna manera de cambiar esto para convertir varios archivos a la vez (ahorrando así en los costos de inicialización de vim)?
DomQ
¡Gracias por la explicación! Estaba teniendo un momento difícil con el comienzo del archivo hasta que leí sobre la configuración de bomba / nobomb.
jjwdesign
1
np, adicionalmente puedes ver el bom si lo usas vim -bohead file.txt|cat -e
Boop
1
por ejemplo:find -regextype posix-extended -type f -regex ".*\.(h|cpp|rc|fx|cs|props|xaml)" -exec vim +'set nobomb | set fenc=utf8 | x' {} \;
Gabriel
Usé esto para convertir la codificación de archivos CSV y me emocioné mucho cuando vi que el juego de caracteres había cambiado. Desafortunadamente, cuando fui a cargar el archivo en MySQL, tenía una cantidad de columnas diferente a la que tenía antes de ejecutar el comando vim. ¿Se pregunta si sería posible simplemente abrir el archivo, convertir la codificación y guardar / cerrar el archivo dejando el resto del contenido del mismo?
NightOwlPrgmr
39

En Linux, puede usar el comando de recodificación muy poderoso para intentar convertir entre los diferentes conjuntos de caracteres, así como cualquier problema de final de línea. recode -l le mostrará todos los formatos y codificaciones que la herramienta puede convertir. Es probable que sea una lista MUY larga.

Cheekysoft
fuente
¿Cómo te conviertes LF? Hay /CRy /CR-LFno hay/LF
Aaron Franke
21

iconv (1)

iconv -f FROM-ENCODING -t TO-ENCODING file.txt

También hay herramientas basadas en iconv en muchos idiomas.

Daniel Papasian
fuente
1
¿Qué pasa con la detección automática de la codificación original?
Aaron Franke
20
Get-Content -Encoding UTF8 FILE-UTF8.TXT | Out-File -Encoding UTF7 FILE-UTF7.TXT

La versión más corta, si puede suponer que la lista de materiales de entrada es correcta:

gc FILE.TXT | Out-File -en utf7 file-utf7.txt
Jay Bazuzi
fuente
1
Aquí hay una versión más corta que funciona mejor. gc .\file-utf8.txt | sc -en utf7 .\file-utf7.txt
Larry Battle
@LarryBattle: ¿Cómo Set-Contentfunciona mejor que Out-File?
Jay Bazuzi
...Oh. Supongo que son casi lo mismo. Tuve problemas para ejecutar su ejemplo porque estaba asumiendo que ambas versiones estaban usando el mismo file-utf8.txtarchivo para la entrada ya que ambas tenían el mismo archivo de salida que file-utf7.txt.
Larry Battle
Esto sería realmente genial, excepto que no es compatible con UTF16. ¡Admite UTF32, pero no UTF16! No necesitaría convertir archivos, excepto que una gran cantidad de software de Microsoft (por ejemplo, SQL Server bcp) insiste en UTF16, y luego su utilidad no se convertirá en él. Interesante por decir lo menos.
Noah
Lo intenté gc -en Ascii readme.html | Out-File -en UTF8 readme.html pero convierte el archivo a utf-8 pero luego está vacío. Notepad ++ dice que el archivo tiene formato Ansi, pero leerlo como lo entiendo, ¿eso ni siquiera es un juego de caracteres válido? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
OZZIE
16

Prueba la función iconv Bash

He puesto esto en .bashrc:

utf8()
{
    iconv -f ISO-8859-1 -t UTF-8 $1 > $1.tmp
    rm $1
    mv $1.tmp $1
}

..para poder convertir archivos así:

utf8 MyClass.java
Arne Evertsson
fuente
8
Es mejor usar tmp = $ (mktmp) para crear un archivo temporal. Además, la línea con rm es redundante.
LMZ
1
¿Puedes completar esta función con el formato de entrada de detección automática?
mlibre
3
cuidado, esta función elimina el archivo de entrada sin verificar que la llamada iconv se realizó correctamente.
philwalk
Esto cambia el contenido del archivo de texto. Ejecuté esto en un UTF-8 con BOM esperando sacar un UTF-8 sin archivo BOM, pero se antepuso al comienzo del archivo.
Aaron Franke
14

Prueba Notepad ++

En Windows pude usar Notepad ++ para hacer la conversión de ISO-8859-1 a UTF-8 . Haga clic "Encoding"y luego "Convert to UTF-8".

Jeremy Glover
fuente
13

Oneliner usando find, con detección automática de juego de caracteres

La codificación de caracteres de todos los archivos de texto coincidentes se detecta automáticamente y todos los archivos de texto coincidentes se convierten a utf-8codificación:

$ find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -bi "$1" |sed -e "s/.*[ ]charset=//") -t utf-8 -o converted "$1" && mv converted "$1"' -- {} \;

Para realizar estos pasos, shse utiliza un subconjunto con -exec, ejecutando una línea con la -cbandera y pasando el nombre del archivo como argumento posicional "$1"con -- {}. En el medio, el utf-8archivo de salida se nombra temporalmente converted.

Por lo que file -bisignifica:

  • -b, --brief No anteponga nombres de archivo a las líneas de salida (modo breve).

  • -i, --mime Hace que el comando de archivo genere cadenas de tipo mime en lugar de las más legibles por humanos. Por lo tanto, puede decir, por ejemplo, en text/plain; charset=us-asciilugar de ASCII text. El sedcomando corta esto solo us-asciicomo lo requiere iconv.

El findcomando es muy útil para dicha automatización de gestión de archivos. Haga clic aquí para más findabundancia .

Serge Stroobandt
fuente
3
Tuve que adaptar esta solución un poco para que funcione en Mac OS X, al menos en mi versión. find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -b --mime-encoding "$1" | awk "{print toupper(\$0)}") -t UTF-8 > converted "$1" && mv converted "$1"' -- {} \;
Brian J. Miller el
1
Su código también funcionó en Windows 7 con MinGW-w64 (última versión). ¡Gracias por compartirlo!
silvioprog
@rmuller El sedcomando está ahí a propósito, lo que permite la detección automática de la codificación de caracteres. He ampliado la respuesta para explicar esto ahora. Sería cortés con respecto a los lectores eliminar cualquier comentario irrelevante restante. Gracias.
Serge Stroobandt
@SergeStroobandt Quizás no estaba lo suficientemente claro. Mi punto es que cuando usas "file -b --mime-encoding" en lugar de "file -bi" no hay necesidad de filtrar el resultado con sed. Este comando ya solo devuelve la codificación del archivo. Entonces, en su ejemplo "us-ascii"
rmuller
En realidad, esto no parece hacer nada por mí en Linux. Guardé un archivo como UTF-8 con BOM y esperaba que se convirtiera a UTF-8 sin BOM y no fue así.
Aaron Franke
3

PHP iconv ()

iconv("UTF-8", "ISO-8859-15", $input);

usuario15096
fuente
1
Esta declaración funciona muy bien al convertir cadenas, pero no para archivos.
jjwdesign
2

DOS / Windows: use la página de códigos

chcp 65001>NUL
type ascii.txt > unicode.txt

El comando chcpse puede usar para cambiar la página de códigos. La página de códigos 65001 es el nombre de Microsoft para UTF-8. Después de configurar la página de códigos, la salida generada por los siguientes comandos será del conjunto de páginas de códigos.

lalthomas
fuente
1

para escribir el archivo de propiedades (Java) normalmente lo uso en Linux (distribuciones mint y ubuntu):

$ native2ascii filename.properties

Por ejemplo:

$ cat test.properties 
first=Execução número um
second=Execução número dois

$ native2ascii test.properties 
first=Execu\u00e7\u00e3o n\u00famero um
second=Execu\u00e7\u00e3o n\u00famero dois

PD: escribí la Ejecución número uno / dos en portugues para forzar caracteres especiales.

En mi caso, en la primera ejecución recibí este mensaje:

$ native2ascii teste.txt 
The program 'native2ascii' can be found in the following packages:
 * gcj-5-jdk
 * openjdk-8-jdk-headless
 * gcj-4.8-jdk
 * gcj-4.9-jdk
Try: sudo apt install <selected package>

Cuando instalé la primera opción (gcj-5-jdk) el problema estaba terminado.

Espero que esto ayude a alguien.

Maciel Bombonato
fuente
0

Mi herramienta favorita para esto es Jedit (un editor de texto basado en Java) que tiene dos características muy convenientes:

  • Uno que permite al usuario volver a cargar un texto con una codificación diferente (y, como tal, controlar visualmente el resultado)
  • Otro que permite al usuario elegir explícitamente la codificación (y el final de la línea char) antes de guardar
Yota
fuente
0

Simplemente cambie la codificación del archivo cargado en IntelliJ IDEA IDE, a la derecha de la barra de estado (abajo), donde se indica el juego de caracteres actual. Solicita Recargar o Convertir, use Convertir. Asegúrese de hacer una copia de seguridad del archivo original por adelantado.

Nikolai Varankine
fuente
0

Si las aplicaciones de la GUI de macOS son su pan de cada día, SubEthaEdit es el editor de texto al que suelo para la codificación y la disputa: su "vista previa de conversión" le permite ver todos los caracteres no válidos en la codificación de salida y corregirlos / eliminarlos.

Y ahora es de código abierto , así que para ellos 😉.

tiennou
fuente