linux - unknown - iconv utf 8
iconv cualquier codificación a UTF-8 (7)
Aquí está mi respuesta ... = D
#!/bin/bash
find <YOUR_FOLDER_PATH> -name ''*'' -type f -exec grep -Iq . {} /; -print0 |
while IFS= read -r -d $''/0'' LINE_FILE; do
CHARSET=$(uchardet $LINE_FILE)
echo "Converting ($CHARSET) $LINE_FILE"
# NOTE: Convert/reconvert to utf8. By Questor
iconv -f "$CHARSET" -t utf8 "$LINE_FILE" -o "$LINE_FILE"
# NOTE: Remove "BOM" if exists as it is unnecessary. By Questor
# [Refs.: https://stackoverflow.com/a/2223926/3223785 ,
# https://stackoverflow.com/a/45240995/3223785 ]
sed -i ''1s/^/xEF/xBB/xBF//'' "$LINE_FILE"
done
# [Refs.: https://justrocketscience.com/post/handle-encodings ,
# https://stackoverflow.com/a/9612232/3223785 ,
# https://stackoverflow.com/a/13659891/3223785 ]
PREGUNTA ADICIONAL: No sé si mi enfoque es el más seguro. Digo esto porque noté que algunos archivos no se convierten correctamente (los caracteres se perderán) o se "truncan". Sospecho que esto tiene que ver con la herramienta "iconv" o con la información del conjunto de caracteres obtenida con la herramienta "uchardet". Tenía curiosidad por la solución presentada en https://stackoverflow.com/a/22841847/3223785 (@demofly) porque podría ser más segura.
Otra respuesta, ahora basada en la respuesta de @demofly ...
#!/bin/bash
find <YOUR_FOLDER_PATH> -name ''*'' -type f -exec grep -Iq . {} /; -print0 |
while IFS= read -r -d $''/0'' LINE_FILE; do
CHARSET=$(uchardet $LINE_FILE)
REENCSED=`echo $CHARSET | sed ''s#^x-mac-#mac#''`
echo "/"$CHARSET/" /"$LINE_FILE/""
# NOTE: Convert/reconvert to utf8. By Questor
recode $REENCSED..UTF-8 "$LINE_FILE" 2> STDERR_OP 1> STDOUT_OP
STDERR_OP=$(cat STDERR_OP)
rm -f STDERR_OP
if [ -n "$STDERR_OP" ] ; then
# NOTE: Convert/reconvert to utf8. By Questor
iconv -f "$CHARSET" -t utf8 "$LINE_FILE" -o "$LINE_FILE" 2> STDERR_OP 1> STDOUT_OP
STDERR_OP=$(cat STDERR_OP)
rm -f STDERR_OP
fi
# NOTE: Remove "BOM" if exists as it is unnecessary. By Questor
# [Refs.: https://stackoverflow.com/a/2223926/3223785 ,
# https://stackoverflow.com/a/45240995/3223785 ]
sed -i ''1s/^/xEF/xBB/xBF//'' "$LINE_FILE"
if [ -n "$STDERR_OP" ] ; then
echo "ERROR: /"$STDERR_OP/""
fi
STDOUT_OP=$(cat STDOUT_OP)
rm -f STDOUT_OP
if [ -n "$STDOUT_OP" ] ; then
echo "RESULT: /"$STDOUT_OP/""
fi
done
# [Refs.: https://justrocketscience.com/post/handle-encodings ,
# https://stackoverflow.com/a/9612232/3223785 ,
# https://stackoverflow.com/a/13659891/3223785 ]
Solución híbrida con recode y vim ...
#!/bin/bash
find <YOUR_FOLDER_PATH> -name ''*'' -type f -exec grep -Iq . {} /; -print0 |
while IFS= read -r -d $''/0'' LINE_FILE; do
CHARSET=$(uchardet $LINE_FILE)
REENCSED=`echo $CHARSET | sed ''s#^x-mac-#mac#''`
echo "/"$CHARSET/" /"$LINE_FILE/""
# NOTE: Convert/reconvert to utf8. By Questor
recode $REENCSED..UTF-8 "$LINE_FILE" 2> STDERR_OP 1> STDOUT_OP
STDERR_OP=$(cat STDERR_OP)
rm -f STDERR_OP
if [ -n "$STDERR_OP" ] ; then
# NOTE: Convert/reconvert to utf8. By Questor
bash -c "</dev/tty vim -u NONE +/"set binary | set noeol | set nobomb | set encoding=utf-8 | set fileencoding=utf-8 | wq/" /"$LINE_FILE/""
else
# NOTE: Remove "BOM" if exists as it is unnecessary. By Questor
# [Refs.: https://stackoverflow.com/a/2223926/3223785 ,
# https://stackoverflow.com/a/45240995/3223785 ]
sed -i ''1s/^/xEF/xBB/xBF//'' "$LINE_FILE"
fi
done
NOTA: Esta fue la solución con el mayor número de conversiones perfectas. Además no teníamos ningún archivo truncado.
ADVERTENCIA: haga una copia de seguridad de sus archivos y use una herramienta de combinación para verificar / comparar los cambios. ¡Los problemas probablemente aparecerán!
SUGERENCIA: El comando sed -i ''1s/^/xEF/xBB/xBF//'' "$LINE_FILE"
se puede ejecutar después de una comparación preliminar con la herramienta de fusión después de una conversión sin él, ya que puede causar "diferencias".
NOTA: La búsqueda usando "buscar" trae todos los archivos no binarios de "YOUR_FOLDER_PATH" y sus subcarpetas.
¡Gracias!
Estoy tratando de apuntar iconv a un directorio y todos los archivos se convertirán a UTF-8 independientemente de la codificación actual
Estoy usando este script pero tienes que especificar de qué codificación vas a ir DESDE. ¿Cómo puedo hacer que detecte automáticamente la codificación actual?
dir_iconv.sh
#!/bin/bash
ICONVBIN=''/usr/bin/iconv'' # path to iconv binary
if [ $# -lt 3 ]
then
echo "$0 dir from_charset to_charset"
exit
fi
for f in $1/*
do
if test -f $f
then
echo -e "/nConverting $f"
/bin/mv $f $f.old
$ICONVBIN -f $2 -t $3 $f.old > $f
else
echo -e "/nSkipping $f - not a regular file";
fi
done
línea terminal
sudo convert/dir_iconv.sh convert/books CURRENT_ENCODING utf8
Aquí está mi solución para ubicar todos los archivos:
#!/bin/bash
apt-get -y install recode uchardet > /dev/null
find "$1" -type f | while read FFN # ''dir'' should be changed...
do
encoding=$(uchardet "$FFN")
echo "$FFN: $encoding"
enc=`echo $encoding | sed ''s#^x-mac-#mac#''`
set +x
recode $enc..UTF-8 "$FFN"
done
https://gist.github.com/demofly/25f856a96c29b89baa32
póngalo en convert-dir-to-utf8.sh
y ejecute:
bash convert-dir-to-utf8.sh /pat/to/my/trash/dir
Tenga en cuenta que sed es una solución para las codificaciones de mac aquí. Muchas codificaciones poco comunes necesitan soluciones como esta.
Compilando todos ellos. Vaya a dir, cree dir2utf8.sh:
#!/bin/bash
# converting all files in a dir to utf8
for f in *
do
if test -f $f then
echo -e "/nConverting $f"
CHARSET="$( file -bi "$f"|awk -F "=" ''{print $2}'')"
if [ "$CHARSET" != utf-8 ]; then
iconv -f "$CHARSET" -t utf8 "$f" -o "$f"
fi
else
echo -e "/nSkipping $f - it''s a regular file";
fi
done
Consulte las herramientas disponibles para la conversión de datos en un servidor de Linux: https://www.debian.org/doc/manuals/debian-reference/ch11.en.html
Además, hay una búsqueda para encontrar una lista completa de codificaciones que están disponibles en iconv
. Simplemente ejecute iconv --list
y descubra que los nombres de codificación difieren de los nombres devueltos por la herramienta uchardet
(por ejemplo: x-mac-cyrillic en uchardet
vs. mac-cyrillic en iconv
)
El comando enca no funciona para mi archivo de texto en chino simplificado con codificación GB2312.
En su lugar, utilizo la siguiente función para convertir el archivo de texto para mí. Por supuesto, podría redirigir la salida a un archivo.
Requiere comandos chardet e iconv .
detection_cat ()
{
DET_OUT=$(chardet $1);
ENC=$(echo $DET_OUT | sed "s|^.*: /(.*/) (confid.*$|/1|");
iconv -f $ENC $1
}
Puede obtener lo que necesita utilizando el archivo gnu utils estándar y awk. Ejemplo:
file -bi .xsession-errors
me da: "text / plain; charset = us-ascii"
entonces el file -bi .xsession-errors |awk -F "=" ''{print $2}''
me da "us-ascii"
Lo uso en scripts así:
CHARSET="$(file -bi "$i"|awk -F "=" ''{print $2}'')"
if [ "$CHARSET" != utf-8 ]; then
iconv -f "$CHARSET" -t utf8 "$i" -o outfile
fi
Tal vez usted está buscando enca
:
Enca es un analizador de caracteres extremadamente ingenuo. Detecta el conjunto de caracteres y la codificación de archivos de texto y también puede convertirlos a otras codificaciones utilizando un convertidor incorporado o bibliotecas externas y herramientas como libiconv, librecode o cstocs.
Actualmente es compatible con codificaciones bielorrusas, búlgaras, croatas, checas, estonias, húngaras, letonas, lituanas, polacas, rusas, eslovacas, eslovenas, ucranianas, chinas, y multibyte independientemente en el idioma.
Tenga en cuenta que, en general, la autodetección de la codificación actual es un proceso difícil (la misma secuencia de bytes puede ser un texto correcto en varias codificaciones). enca
utiliza heurísticas basadas en el idioma que le pides que detecte (para limitar el número de codificaciones). Puede usar enconv
para convertir archivos de texto a una sola codificación.