¿Cómo puedo convertir por lotes archivos en un directorio para su codificación (por ejemplo, ANSI-> UTF-8) con un comando o herramienta?
Para archivos individuales, un editor ayuda, pero ¿cómo hacer el trabajo de archivos masivos?
¿Cómo puedo convertir por lotes archivos en un directorio para su codificación (por ejemplo, ANSI-> UTF-8) con un comando o herramienta?
Para archivos individuales, un editor ayuda, pero ¿cómo hacer el trabajo de archivos masivos?
Respuestas:
Cygwin o GnuWin32 proporcionan herramientas de Unix como iconv
y 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 .
iconv
parece 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 ...
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 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
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.
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-8
codificació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, sh
se usa un subconjunto con -exec
, ejecutando una línea con la -c
bandera y pasando el nombre del archivo como argumento posicional "$1"
con -- {}
. En el medio, el utf-8
archivo de salida se nombra temporalmente converted
.
El find
comando es muy útil para dicha automatización de gestión de archivos.
Haga clic aquí para más find
abundancia .
iconv -f original_charset -t utf-8 originalfile > newfile
ejecuta el comando anterior en for loop.
Use este script de Python: https://github.com/goerz/convert_encoding.py Funciona en cualquier plataforma. Requiere Python 2.7.
Hay dos2unix
en unix.
Había otra herramienta similar para Windows ( otra referencia aquí ).
¿Cómo convierto entre archivos de texto de Unix y Windows? tiene algunos trucos más
dos2unix
es útil para convertir saltos de línea , pero el OP está buscando convertir codificaciones de caracteres.
Puedes usar EncodingMaster . Es gratis, tiene una versión para Windows, Linux y Mac OS X y funciona muy bien.
En mi caso de uso, necesitaba la detección automática de codificación de entrada y había muchos archivos con Windows-1250
codificació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' -- {} \;