Windows 7 UTF-8 y Unicode

14

¿Podría alguien explicar qué ha cambiado en Windows 7 (Pro de 64 bits)?

Detalles: Anteriormente tenía Windows XP y tenía algunos archivos de traducción (codificados en UTF-8) en formato CSV. Pude ver las fuentes tanto en el Bloc de notas como en Excel. Después de actualizar a Windows 7, cuando abro estos archivos, todo lo que veo son cuadros cuadrados (solo sabes, si los abro en el navegador, pude ver toda la traducción). Si guardo esos archivos en Unicode, todo parece estar bien.

Entonces, ¿qué está pasando exactamente? ¿Por qué Windows 7 funciona con Unicode y no con UTF-8?

Esquisto
fuente

Respuestas:

30

¿Por qué Windows 7 funciona con Unicode y no con UTF-8?

Terminología

Unicode y UTF-8 no son el mismo tipo de cosas: Unicode es un juego de caracteres que define un conjunto de caracteres (un repertorio) y los números asignados (código de puntos) para cada uno de esos personajes. UTF ‑ 8 es una de varias codificaciones que se pueden usar para representar una secuencia de caracteres Unicode en el disco o en la transmisión. El mismo flujo de caracteres Unicode también podría codificarse como UTF-16, UTF-32 o UTF-7, por ejemplo.

Sin embargo, el Bloc de notas ofertas que "codifica" opciones, incluyendo ANSI, Unicode, Unicode big-endiany UTF-8. Los desarrolladores de Microsoft que escribieron esto han usado los términos incorrectos. Cuando dicen "Unicode", lo más probable es que signifiquen " UTF-16 little-endian ". Cuando dicen "ANSI" se refieren a la página de códigos 1252 (CP-1252).

Bloc de notas de Microsoft

Creo que el Bloc de notas de Microsoft escribe UTF-16 con una marca de orden de bytes ( BOM ) y que el Bloc de notas busca la BOM cuando lee un archivo de texto. La lista de materiales le dice a la aplicación que el archivo es UTF-16 e indica si es big-endian o little-endian.

Si el Bloc de notas no encuentra la lista de materiales, llama a una función de biblioteca IsTextUnicode, que examina los datos e intenta adivinar qué codificación se utilizó. A veces (inevitablemente) adivina incorrectamente. A veces adivina que un archivo "ANSI" es "Unicode". Intentar interpretar un archivo UTF-16 o UTF-8 como página de códigos 1252 provocaría que muestre los glifos incorrectos y no pueda encontrar glifos para representar algunos valores de 8 bits; estos se mostrarían como cuadrados.

Como dice harrymc en su respuesta , hay mejores alternativas al Bloc de notas. Pero el Bloc de notas le permite elegir explícitamente la codificación al abrir un archivo (en lugar de abandonar el Bloc de notas para intentar adivinar).

Marcas de orden de bytes

Según el consorcio Unicode, las marcas de orden de bytes (BOM) son opcionales. Sin embargo, Windows se basa en listas de materiales para distinguir entre algunas codificaciones.

En resumen, ¿quizás sus archivos carecían de una lista de materiales por alguna razón? ¿Quizás la lista de materiales se perdió en algún momento durante el proceso de actualización?

Si todavía tiene los archivos originales que se muestran como cuadrados, puede hacer un volcado hexadecimal de ellos para ver si contienen una lista de materiales.


Estándares de archivos de texto sin formato

El problema es que efectivamente no hay ninguno , no hay estándares universales para archivos de texto sin formato. En cambio, tenemos una serie de incompatibilidades e incógnitas.

  • ¿Cómo se han marcado los finales de línea? Algunas plataformas usan el retorno de carro de caracteres de control (CR) seguido de salto de línea (LF), algunas usan CR solo y otras usan LF solo.

  • ¿Son los terminadores o separadores anteriores? Esto tiene un efecto al final de un archivo y se sabe que causa problemas.

  • Tratamiento de pestañas y otros caracteres de control. Podemos suponer que se usa una pestaña para alinear a un múltiplo de 8 anchos de caracteres estándar desde el comienzo de la línea, pero realmente no hay certeza al respecto. Muchos programas permiten modificar las posiciones de las pestañas.

  • Conjunto de caracteres y codificación? No existe un estándar universal para indicar cuáles de estos se han utilizado para el texto del archivo. Lo más cercano que tenemos es buscar la presencia de una lista de materiales que indica que la codificación es una de las utilizadas para Unicode. Desde el valor de BOM, el programa que lee el archivo puede distinguir entre UTF-8 y UTF-16, etc., y entre las variantes Little-Endian y Big-Endian de UTF-16, etc. No existe un estándar universal para indicar que un archivo está codificado en cualquier otra codificación popular como CP-1252 o KOI-8.

Y así. Ninguno de los metadatos anteriores se escribe en el archivo de texto, por lo que el usuario final debe informar al programa al leer el archivo. El usuario final tiene que conocer los valores de metadatos para cualquier archivo específico o correr el riesgo de que su programa use los valores de metadatos incorrectos.

Bush ocultó los hechos

Prueba esto en Windows XP.

  • Abra el Bloc de notas.
  • Establezca la fuente en Arial Unicode MS. (Es posible que deba instalarlo primero; si no lo ve en el menú, haga clic en "Mostrar más fuentes").
  • Ingrese el texto "Bush ocultó los hechos".
  • Elija Save As. Desde el Encodingmenú, seleccione ANSI.
  • Cerrar el Bloc de notas.
  • Vuelva a abrir el documento (por ejemplo, utilizando Start, My Recent Documents).
  • Verá 畂 桳 栠 摩 琠 敨 映 捡 獴 en lugar de "Bush ocultó los hechos".

Esto ilustra que la IsTextUnicodefunción utilizada por el Bloc de notas adivina incorrectamente que el texto ANSI (realmente Código de página 1252) es Unicode UTF-16LE sin una lista de materiales. No hay una lista de materiales en un archivo guardado como ANSI.

Windows 7

Con Windows 7, Microsoft se ajustó IsTextUnicodepara que lo anterior no suceda. En ausencia de una lista de materiales, ahora es más probable que adivine ANSI (CP 1252) que Unicode (UTF-16LE). Con Windows-7, espero que sea más probable que tenga el problema inverso: un archivo que contiene caracteres Unicode con puntos de código superiores a 255, pero sin BOM, ahora es más probable que se adivine como ANSI y, por lo tanto, se muestre incorrectamente.

Prevenir problemas de codificación

Actualmente, el mejor enfoque parece ser usar UTF-8 en todas partes. Lo ideal sería volver a codificar todos los archivos de texto antiguos en UTF-8 y solo guardar archivos de texto como UTF-8. Hay herramientas como recode e iconv que pueden ayudar con esto.

RedGrittyBrick
fuente
3
Según Wikipedia : en Windows Vista y Windows 7 [..] IsTextUnicode se ha modificado para que sea mucho más probable adivinar una codificación basada en bytes en lugar de UTF-16LE.
Arjan
Sí, seguro que esos archivos tienen BOM ya que generamos esos archivos con BOM. Es interesante que Windows 7 no lea la lista de materiales creada por el sistema operativo anterior.
Sha Le
BOM no ha cambiado. Es posible que a sus archivos les falte la lista de materiales, pero que anteriormente el formato predeterminado era alguna variante Unicode, donde ahora es ASCII. Mira mi respuesta.
harrymc
@Sha Le: si el archivo tiene una lista de materiales, el Bloc de notas de Windows 7 debería abrirlo correctamente, por lo que el problema que describa no encaja con los problemas conocidos isTextUnicode. ¿Puede crear un pequeño archivo de muestra que ilustre el problema que tiene con un archivo que incluye una lista de materiales?
RedGrittyBrick
También existe this app can breakel mismo efecto queBush hid the facts
Regente
3

Una observación: puede usar Notepad ++ para ver estos archivos, usando el menú Codificación.

Una vez que los archivos se muestran correctamente, guardarlos agregará la lista de materiales correcta.

harrymc
fuente
Sé que esta publicación es un poco antigua, pero actualmente tengo problemas con win 7 y notepad ++ que no muestra UTF 8 sin BOM cuando los archivos se crearon inicialmente usando notepad ++ v5.9.6.2.
Jake
@Jake: asegúrese de que el menú Codificación muestre "Codificar en UTF8", en lugar de "Codificar en UTF8 sin BOM".
harrymc
1

En Windows 10 es posible (prueba en la compilación 1903)

  1. Copie su archivo con buena codificación TXTUTF-8.txta C:\WINDOWS\SHELLNEW.
  2. En HKEY_CLASSES_ROOT\.txt\ShellNewhacer una nueva cadena con nombre " FileName"
  3. Cambiar el valor de " FileName" a " TXTUTF-8.txt"

Ahora, cuando crea un nuevo archivo txt usando el menú de Windows, tomará su TXTUTF-8.txtplantilla

Fuente: https://answers.microsoft.com/fr-fr/windows/forum/all/configurer-lencodage-par-d%C3%A9faut-en-utf-8-dans/9c0358ca-a2b3-43e8-a154- d10c1fe94317

e2dy Dev
fuente