codificacion encoding utf-8 character-encoding windows-1252

encoding - codificacion - Codificación de Windows-1252 a UTF-8



windows 1252 to utf 8 (10)

He copiado ciertos archivos de una máquina Windows a una máquina Linux. Por lo tanto, todos los archivos codificados de Windows (windows-1252) deben convertirse a UTF-8. Los archivos que ya están en UTF-8 no deben ser cambiados. Estoy planeando usar la utilidad recode para eso. ¿Cómo puedo especificar que la utilidad de recode solo debe convertir los archivos codificados de Windows-1252 y no los archivos UTF-8?

Ejemplo de uso de recode:

recode windows-1252.. myfile.txt

Esto convertiría myfile.txt de windows-1252 a UTF-8. Antes de hacer esto, me gustaría saber que myfile.txt es en realidad Windows-1252 codificado y no UTF-8 codificado. De lo contrario, creo que esto corrompería el archivo.


¿Cómo esperas que recode sepa que un archivo es Windows-1252? En teoría, creo que cualquier archivo es un archivo válido de Windows-1252, ya que asigna todos los bytes posibles a un carácter.

Ahora, sin duda hay características que sugieren que es UTF-8, si comienza con la lista de materiales de UTF-8, por ejemplo, pero no serían definitivas.

Una opción sería detectar si en realidad es un archivo UTF-8 completamente válido, supongo ... otra vez, eso solo sería sugerente.

No estoy familiarizado con la herramienta de recodificación en sí, pero es posible que desee ver si es capaz de recodificar un archivo desde y hacia la misma codificación, si lo hace con un archivo no válido (es decir, uno que contenga secuencias de bytes UTF-8 no válidas). ) puede convertir las secuencias inválidas en signos de interrogación o algo similar. En ese punto, podría detectar que un archivo es UTF-8 válido si lo graba en UTF-8 y observa si la entrada y la salida son idénticas.

Alternativamente, haga esto mediante programación en lugar de usar la utilidad de recodificación, por ejemplo, sería bastante sencillo en C #.

Sin embargo, solo para reiterar: todo esto es heurístico. Si realmente no conoces la codificación de un archivo, nada te lo dirá con el 100% de precisión.


Aquí hay una transcripción de otra respuesta que le di a una pregunta similar:

Si aplica utf8_encode () a una cadena UTF8 ya, devolverá una salida UTF8 confusa.

Hice una función que aborda todos estos problemas. Se llama Encoding :: toUTF8 ().

No necesitas saber cuál es la codificación de tus cadenas. Puede ser Latin1 (ISO 8859-1), Windows-1252 o UTF8, o la cadena puede tener una mezcla de ellos. Encoding :: toUTF8 () convertirá todo a UTF8.

Lo hice porque un servicio me estaba dando una fuente de datos desordenados, mezclando UTF8 y Latin1 en la misma cadena.

Uso:

$utf8_string = Encoding::toUTF8($utf8_or_latin1_or_mixed_string); $latin1_string = Encoding::toLatin1($utf8_or_latin1_or_mixed_string);

Descargar:

https://github.com/neitanod/forceutf8

Actualizar:

He incluido otra función, Encoding :: fixUFT8 (), que arreglará cada cadena UTF8 que se ve confusa.

Uso:

$utf8_string = Encoding::fixUTF8($garbled_utf8_string);

Ejemplos:

echo Encoding::fixUTF8("Fédération Camerounaise de Football"); echo Encoding::fixUTF8("Fédération Camerounaise de Football"); echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football"); echo Encoding::fixUTF8("Fédération Camerounaise de Football");

saldrá:

Fédération Camerounaise de Football Fédération Camerounaise de Football Fédération Camerounaise de Football Fédération Camerounaise de Football

Actualización: He transformado la función (forceUTF8) en una familia de funciones estáticas en una clase llamada Codificación. La nueva función es Encoding :: toUTF8 ().


Encontré esta documentación para el comando TYPE :

Convierta un archivo ASCII (Windows1252) en un archivo de texto Unicode (UCS-2):

For /f "tokens=2 delims=:" %%G in (''CHCP'') do Set _codepage=%%G CHCP 1252 >NUL CMD.EXE /D /A /C (SET/P=ÿþ)<NUL > unicode.txt 2>NUL CMD.EXE /D /U /C TYPE ascii_file.txt >> unicode.txt CHCP %_codepage%

La técnica anterior (basada en un guión de Carlos M.) primero crea un archivo con una marca de orden de bytes (BOM) y luego agrega el contenido del archivo original. CHCP se utiliza para garantizar que la sesión se ejecute con la página de códigos de Windows1252 para que los caracteres 0xFF y 0xFE (ÿþ) se interpreten correctamente.


No hay una manera general de saber si un archivo está codificado con una codificación específica. Recuerde que una codificación no es más que un "acuerdo" sobre cómo se deben asignar los bits de un archivo a los caracteres.

Si no sabe cuáles de sus archivos ya están codificados en UTF-8 y cuáles están codificados en windows-1252, tendrá que inspeccionar todos los archivos y descubrirlo usted mismo. En el peor de los casos, eso podría significar que tiene que abrir cada uno de ellos con cualquiera de las dos codificaciones y ver si "parecen" correctas, es decir, todos los caracteres se muestran correctamente. Por supuesto, puede usar el soporte de herramientas para hacer eso, por ejemplo, si está seguro de que ciertos caracteres están contenidos en los archivos que tienen una asignación diferente en windows-1252 frente a UTF-8, podría grep para ellos después de ejecutar los archivos a través de ''iconv'' como lo menciona Seva Akekseyev.

Otro caso afortunado para usted sería, si sabe que los archivos realmente contienen solo caracteres que están codificados de manera idéntica tanto en UTF-8 como en windows-1252. En ese caso, por supuesto, ya has terminado.


Puede cambiar la codificación de un archivo con un editor como notepad ++. Solo ve a Codificación y selecciona lo que quieras.

Siempre prefiero el Windows 1252


Si desea cambiar el nombre de varios archivos en un solo comando, digamos que desea convertir todos los archivos *.txt , aquí está el comando:

find . -name "*.txt" -exec iconv -f WINDOWS-1252 -t UTF-8 {} -o {}.ren /; -a -exec mv {}.ren {} /;


Si está seguro de que sus archivos son UTF-8 o Windows 1252 (o Latin1), puede aprovechar el hecho de que Recode saldrá con un error si intenta convertir un archivo no válido.

Si bien utf8 es válido para Win-1252, lo contrario no es cierto: win-1252 NO es válido para UTF-8. Asi que:

recode utf8..utf16 <unknown.txt >/dev/null || recode cp1252..utf8 <unknown.txt >utf8-2.txt

Escupirá los errores para todos los archivos cp1252 y luego los convertirá a UTF8.

Envolvería esto en un script de bash más limpio, manteniendo una copia de seguridad de cada archivo convertido.

Antes de realizar la conversión del conjunto de caracteres, es posible que desee asegurarse primero de tener finales de línea consistentes en todos los archivos. De lo contrario, recode se quejará por eso, y puede convertir archivos que ya eran UTF8, pero que solo tenían los finales de línea incorrectos.


UTF-8 no tiene una lista de materiales, ya que es superflua e inválida. Cuando una lista de materiales es útil es en UTF-16, que puede intercambiarse como en el caso de Microsoft. UTF-16 si para representación interna en un búfer de memoria. Utilice UTF-8 para el intercambio. De forma predeterminada, tanto UTF-8 como cualquier otra cosa derivada de US-ASCII y UTF-16 son orden de bytes natural / de red. El Microsoft UTF-16 requiere una lista de materiales ya que se intercambia el byte.

Para convertir Windows-1252 a ISO8859-15, primero convierto ISO8859-1 a US-ASCII para códigos con glifos similares. Luego convierto Windows-1252 a ISO8859-15, otros glifos que no son ISO8859-15 a múltiples caracteres US-ASCII.


Utilice el comando iconv .

Para asegurarse de que el archivo está en Windows-1252, ábralo en el Bloc de notas (en Windows) y luego haga clic en Guardar como. Bloc de notas sugiere la codificación actual como predeterminada; si es Windows-1252 (o cualquier página de códigos de 1 byte, por así decirlo), diría "ANSI".


puedes usar iconv:

iconv -f WINDOWS-1252 -t UTF-8 filename.txt