para - Normalización Unicode en Windows
tag rename (3)
qué formulario de normalización se utiliza de forma predeterminada para la entrada del usuario
Depende de la distribución de tu teclado / IME. Es posible generar la forma normal C, D, o una mezcla loca de ambos si lo desea.
Las distribuciones de teclado tienden a NFC porque en los días anteriores a Unicode solían emitir un solo byte en la página de códigos local para cada pulsación de tecla. Sin embargo hay excepciones.
Por ejemplo, al usar la distribución de teclado vietnamita de Windows, algunos signos diacríticos se escriben como una sola pulsación de tecla combinada con la letra (por ejemplo, circunflejo) y otros se escriben como una combinación diacrítica (por ejemplo, grave à
). El graheme a-with-circumflex-and-grave se escribiría como a-circumflex seguido de combinación-grave ầ
que sería 0xE2,0xCC en la página de código vietnamita 1258, y saldría como U + 00E2, U + 0300 en Unicode.
Esto no está en la forma normal C (que sería ầ
U + 1EA7 minúscula latina A con circunflejo y grave) ni D (que sería ầ
U + 0061, U + 0302, U + 0300).
En general, existe una preferencia cultural por NFC en el mundo de Windows y en la web, y por NFD en el mundo de Apple. Pero no se aplica de manera rigurosa y debe esperar enfrentarse a cualquier combinación de caracteres combinados y descompuestos.
¿El núcleo y el sistema de archivos son normalización-agnósticos?
Sí, el kernel y el sistema de archivos no saben nada acerca de la normalización y con mucho gusto le permitirán tener archivos con los nombres ầ.txt
, ầ.txt
y ầ.txt
en la misma carpeta.
He estado utilizando "cadenas de Unicode" en Windows durante todo el tiempo que ... He aprendido sobre Unicode (por ejemplo, después de graduarme). Sin embargo, siempre me desconcertó que el Win32API mencione "unicode" muy libremente. En particular, la variante "unicode" mencionada por MSN es UTF-16 (aunque la terminología "wide char" proviene del hecho de que solía ser UCS-2, que no es Unicode). Sin embargo, casi no hace mención de la normalización de Unicode.
MSN tiene algunas páginas sobre los formularios de normalización de Unicode y Unicode y funciones para cambiar el formulario de normalización . La página en la normalización incluso dice:
Win32 y .NET Framework son compatibles con los cuatro formularios de normalización.
Sin embargo, no he encontrado en ninguna parte de la documentación qué formulario de normalización utiliza (o entiende) la API de Win32.
Pregunta 1 : ¿qué formulario de normalización se usa de forma predeterminada para la entrada del usuario (como un control de edición) y la conversión a través de MultiByteToWideChar()
?
Pregunta 2 : ¿las cadenas pasadas a las funciones de Win32API deben estar en una forma de normalización particular, o son la normalización del sistema de archivos y del kernel?
Del artículo de MSDN Uso de la normalización de Unicode para representar cadenas .
Windows, las aplicaciones de Microsoft y .NET Framework generalmente generan caracteres en forma C utilizando métodos de entrada normales. Para la mayoría de los propósitos en Windows, la forma C es la forma preferida. Por ejemplo, los caracteres en la forma C son producidos por la entrada del teclado de Windows. Sin embargo, los caracteres importados de la Web y otras plataformas pueden introducir otros formularios de normalización en el flujo de datos.
Actualización: He incluido algunos detalles específicos relacionados con la Pregunta # 2.
En lo que respecta al sistema de archivos, no es necesaria la normalización, según el artículo de nombre de archivos, rutas y espacios de nombres .
No es necesario realizar ninguna normalización de Unicode en la ruta y las cadenas de nombre de archivo para que las funciones de la API de E / S de archivos de Windows las utilice, ya que el sistema de archivos trata la ruta y los nombres de archivos como una secuencia opaca de WCHAR. Cualquier normalización que requiera su aplicación debe realizarse teniendo esto en cuenta, al margen de cualquier llamada a las funciones relacionadas de la API de E / S de archivos de Windows.
Con respecto a SQL Server, no se requiere normalización, ni los datos se normalizan cuando se guardan en la base de datos . Dicho esto, al comparar cadenas, SQL Server 2000 utiliza su propio mecanismo de normalización de cadenas dentro de los índices; pero no puedo encontrar detalles específicos sobre lo que es eso. Un artículo de SQL Server 2005 dice lo mismo .
Un cambio importante en SQL Server 7.0 fue la provisión de un modelo de sistema operativo independiente para la comparación de cadenas, de modo que las intercalaciones entre todos los sistemas operativos de Windows 95 a Windows 2000 serían consistentes. Este código de comparación de cadenas se basó en el mismo código que Windows 2000 usa para su propia normalización de cadenas y se encapsula para que sea el mismo en todas las computadoras y en todas las versiones de SQL Server.
En primer lugar, gracias por una excelente pregunta. Encontré la respuesta en el blog de Michael Kaplan :
Pero como todos los métodos de ingreso de texto en Windows tienden a usar la misma forma de normalización ya (formulario C), ...