Convertir archivos por lotes para codificar


Respuestas:


36

Cygwin o GnuWin32 proporcionan herramientas de Unix como iconvy dos2unix(y unix2dos). En Unix / Linux / Cygwin, querrás usar "windows-1252" como codificación en lugar de ANSI (ver más abajo). (A menos que sepa que su sistema está usando una página de códigos que no sea 1252 como su página de códigos predeterminada, en cuyo caso deberá indicarle a iconv la página de códigos correcta para traducir).

Convierte de uno ( -f) a otro ( -t) con:

$ iconv -f windows-1252 -t utf-8 infile > outfile

O en una forma de buscar y conquistar:

## this will clobber the original files!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 {} \> {} \;

Alternativamente:

## this will clobber the original files!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 -o {} {} \;

Esta pregunta se ha hecho muchas veces en este sitio, así que aquí hay información adicional sobre "ANSI". En una respuesta a una pregunta relacionada, CesarB menciona :

Hay varias codificaciones que se llaman "ANSI" en Windows. De hecho, ANSI es un nombre inapropiado . iconv no tiene forma de adivinar cuál quieres.

La codificación ANSI es la codificación utilizada por las funciones "A" en la API de Windows (las funciones "W" usan UTF-16). La codificación a la que corresponde generalmente depende del idioma de su sistema Windows. El más común es el CP 1252 (también conocido como Windows-1252). Entonces, cuando su editor dice ANSI, significa "lo que las funciones de API usan como codificación ANSI predeterminada", que es la codificación no Unicode predeterminada utilizada en su sistema (y, por lo tanto, generalmente la que se utiliza para archivos de texto).

La página a la que enlaza ofrece este dato histórico (citado de un PDF de Microsoft ) sobre los orígenes de CP 1252 e ISO-8859-1, otra codificación utilizada con frecuencia:

[...] esto proviene del hecho de que la página de códigos de Windows 1252 se basó originalmente en un borrador de ANSI, que se convirtió en la norma ISO 8859-1. Sin embargo, al agregar puntos de código al rango reservado para los códigos de control en el estándar ISO, la página de códigos de Windows 1252 y las páginas de códigos de Windows posteriores basadas originalmente en la serie ISO 8859-x se desviaron de ISO. Hasta el día de hoy, no es raro que la comunidad de desarrollo, tanto dentro como fuera de Microsoft, confunda la página de códigos 8859-1 con Windows 1252, y vea "ANSI" o "A" para indicar el soporte de la página de códigos de Windows .


44
¡No use el mismo nombre de archivo como entrada y salida! iconvparece truncar los archivos a 32,768 bytes si exceden este tamaño. Mientras escribe en el archivo que intenta leer, se las arregla para hacer el trabajo si el archivo es lo suficientemente pequeño, de lo contrario, trunca el archivo sin ninguna advertencia ...
Niavlys

1
FYI Esta pregunta está etiquetada con osx y no parece que ninguno de los comandos convert-all funcione en Yosemite o El Cap. La versión iconv que Apple envía no es compatible con --verbose o -o, y la otra stdout de redirección de sintaxis no funciona por alguna razón y simplemente la envía a la stdout normal.
Scott McIntyre

28

con powershell puedes hacer algo como esto:

%  get-content IN.txt | out-file -encoding ENC -filepath OUT.txt

mientras que ENC es algo así como unicode, ascii, utf8, utf32. checkout 'ayuda fuera de archivo'.

para convertir todos los archivos * .txt en un directorio a utf8, haga algo como esto:

% foreach($i in ls -name DIR/*.txt) { \
       get-content DIR/$i | \
       out-file -encoding utf8 -filepath DIR2/$i \
  }

que crea una versión convertida de cada archivo .txt en DIR2.

EDITAR: Para reemplazar los archivos en todos los subdirectorios use:

% foreach($i in ls -recurse -filter "*.java") {
    $temp = get-content $i.fullname
    out-file -filepath $i.fullname -inputobject $temp -encoding utf8 -force
}

La conversión de ANSI a UTF a través de su primera propuesta borra todo el contenido de mi archivo de texto ...
Acroneos

@Acroneos: cometió un error: el archivo interno es IN.txt, el archivo externo es OUT.txt ... de esta manera es imposible sobrescribir el original. si usó el mismo nombre de archivo para IN.txt y OUT.txt, entonces sobrescribe el archivo del que está leyendo, obviamente.
akira

Powershell se convertirá a UTF con BOM. find e iconv podrían ser mucho más fáciles.
pparas

6

La página de Wikipedia en nuevas líneas tiene una sección sobre utilidades de conversión .

Esta parece ser su mejor apuesta para una conversión utilizando solo las herramientas con las que Windows viene:

TYPE unix_file | FIND "" /V > dos_file

3

UTFCast es un convertidor Unicode para Windows que admite el modo por lotes. Estoy usando la versión paga y estoy bastante cómodo con ella.

UTFCast es un convertidor Unicode que le permite convertir por lotes todos los archivos de texto a codificaciones UTF con solo un clic de su mouse. Puede usarlo para convertir un directorio lleno de archivos de texto a codificaciones UTF, incluidos UTF-8, UTF-16 y UTF-32 a un directorio de salida, mientras mantiene la estructura de directorios de los archivos originales. Ni siquiera importa si su archivo de texto tiene una extensión diferente, UTFCast puede detectar automáticamente archivos de texto y convertirlos.


Parece que no pueden convertirse en la misma carpeta, solo en otra carpeta de destino.
Uwe Keim

La versión pro permite la conversión en el lugar. $ 20/3 meses. rotatingscrew.com/utfcast-version-comparison.aspx
SherylHohman

¡Oh, la versión express (gratuita) es inútil, solo "Detecta" utf-8 CON BOM! (Todos pueden hacer eso ). Solo la versión Pro que se renueva automáticamente cada 3 meses a $ 20 por pop se detectará automáticamente. El precio es elevado para un usuario no empresarial. Y tenga cuidado si prueba la versión básica, y su archivo ya es utf-8 (sin BOM), entonces este convertidor lo detectará como ASCII, luego (re) lo "convertirá" a utf-8, lo que podría resultar en galimatías . ¡Tenga cuidado si esto antes de probar la versión express! Tienen una versión de demostración para el profesional que no produce resultados, ¡en mi humilde opinión no tiene sentido porque no puede verificar los resultados antes de comprar!
SherylHohman

3

Oneliner usando find, con detección automática

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 usa 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.

El findcomando es muy útil para dicha automatización de gestión de archivos.

Haga clic aquí para más findabundancia .


1

iconv -f original_charset -t utf-8 originalfile > newfile

ejecuta el comando anterior en for loop.





0

En mi caso de uso, necesitaba la detección automática de codificación de entrada y había muchos archivos con Windows-1250codificación, para lo cual el comando file -bi <FILE>regresa charset=unknown-8bit. Este no es un parámetro válido para iconv.

He tenido los mejores resultados con enca .

Convierta todos los archivos con extensión txt a utf-8

find . -type f -iname *.txt -exec sh -c 'echo "$1" && enca "$1" -x utf-8' -- {} \;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.