ver unknown files convert charset all linux ubuntu encoding utf-8 iconv

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.