2008-11-18 11 views
14

Esto es principalmente una pregunta teórica sobre la que estoy muy curioso. (No estoy tratando de hacer esto codificando yo mismo ni nada, no estoy reinventando ruedas.)¿Cómo se configuran las cadenas en mayúsculas/minúsculas en Unicode?

Mi pregunta es cómo funciona la tabla de equivalencia en mayúscula/minúscula para Unicode.

Por ejemplo, si tuviera que hacer esto en ASCII, tomaría un carácter, y si cae dentro del rango [a-z], sumaría la diferencia entre A y a.

Si no cae en ese rango, tendría una pequeña tabla de equivalencias para los 10 o más caracteres acentuados más ñ. (O bien, podría tener una matriz de equivalencia completa con 256 entradas, la mayoría de las cuales sería la misma que la entrada)

Sin embargo, supongo que hay una mejor manera de especificar las equivalencias en Unicode, dado que hay cientos de miles de caracteres y que, teóricamente, se puede agregar un nuevo idioma o conjunto de caracteres (y espero que no sea necesario aplicar un parche a las ventanas cuando eso ocurra).

¿Windows tiene una enorme tabla de equivalencia codificada para cada personaje? ¿O cómo se implementa esto?

Una pregunta relacionada es cómo SQL Server implementa las consultas insensibles a mayúsculas y minúsculas insensibles a mayúsculas y minúsculas. ¿Tiene una tabla interna que dice que é ë É É È y Ë son todos equivalentes a "e"?

Eso no suena muy rápido a la hora de comparar cadenas.

¿Cómo accede a los índices rápidamente? ¿Ya indexa los valores convertidos a sus caracteres "base", que corresponden a la intercalación de ese campo?

¿Alguien conoce las partes internas de estas cosas?

¡Gracias!

+0

Espero que necesite parchar ventanas si agregaron un nuevo juego de caracteres a unicode, pero que sería un parche de prioridad muy baja, ya que inicialmente nadie usaría esos caracteres. –

+0

"una pequeña tabla de equivalencias para los 10 o más caracteres acentuados más ñ" - tendrá que entender que "pequeño" significa aproximadamente 100 veces más grande de lo que pensaba. –

+1

No estoy del todo seguro de entender por qué todas las variantes de e que no puedo escribir con mi teclado son todas iguales a "e". Puedo entenderlo desde el punto de vista de una base de datos (para buscar ignorando acentos especiales) pero desde una perspectiva de lenguaje, todos son caracteres diferentes ... –

Respuesta

11

Hay un archivo de mapeo que contiene todas las asignaciones de casos que tienen una proporción de mapeo 1: 1. Usualmente los sistemas operativos/frameworks/bibliotecas soportan una versión específica de Unicode, y dado que este archivo de asignaciones de casos es versionado, usted obtendría las asignaciones para cualquier versión de Unicode que soporte su sistema operativo/framework/library/lo que sea.

Para obtener más información sobre los casos de asignaciones UNICODE, consulte: http://www.unicode.org/faq/casemap_charprop.html

3

La mayoría de los sistemas de escritura no tienen letras mayúsculas y minúsculas separadas. Según Wikipedia, las excepciones incluyen "alfabetos romanos, griegos, cirílicos y armenios".

Así que no hay tantas letras de qué preocuparse. This page muestra que los rangos grandes de caracteres siguen un esquema simple de agregar 1 a un carácter en mayúsculas para obtener el equivalente en minúsculas (aunque, por supuesto, hay algunas excepciones).

16

Voy a abordar la parte de esta pregunta de MS SQL Server, pero la respuesta "correcta" en realidad depende de los idiomas admitidos y la aplicación.

Cuando crea una tabla en SQL Server, cada campo de texto tiene una intercalación implícita o explícitamente especificada. Esto afecta tanto el orden de clasificación como el comportamiento de comparación. El valor predeterminado, para la mayoría de las configuraciones regionales en inglés (EE. UU.), Es Latin1_General_CI_AS o Latin 1, no distingue entre mayúsculas y minúsculas y es sensible a los acentos. Eso significa que, por ejemplo, a = A, pero a! = Ä y a! = Ä.También puede usar insensible a los acentos (Latin1_General_CI_AI) que trata todas las variaciones diacríticas de "A" como iguales.

Algunas configuraciones regionales admiten otras categorías de comparación; por ejemplo, el francés ordena palabras que contienen signos diacríticos de forma algo diferente que el alemán. Turkish considera una i sin puntos y punteada i semánticamente diferente, por lo que ni yo ni yo igualamos las comparaciones insensibles a mayúsculas/minúsculas si utiliza la intercalación turca, no distingue entre mayúsculas y minúsculas y acentúa.

Puede cambiar la intercalación por base de datos, por tabla, por campo y, con algún costo, incluso por consulta. Según entiendo, los índices se normalizan de acuerdo con el orden de clasificación especificado, lo que significa que, básicamente, el índice mantiene una versión aplanada de la cadena original. Por ejemplo, con intercalaciones que no distinguen entre mayúsculas y minúsculas, Apple y Apple se almacenan como manzana. Las consultas se aplanan con la misma intercalación antes de la búsqueda.

En japonés, hay otra categoría de normalización, donde los caracteres de ancho completo y medio ancho como ア = ア, y en algunos casos, dos caracteres de medio ancho se aplanan en un único carácter semánticamente equivalente (バ = バ). Finalmente, para algunos idiomas, hay otra bola de cera con caracteres compuestos, donde los caracteres diacríticos aislados se pueden componer con otros caracteres (por ejemplo, la diéresis en ä es un carácter, compuesta con la forma simple a). El vietnamita, el tailandés y algunos otros idiomas tienen variaciones de esta categoría. Si hay una forma canónica, la normalización Unicode permite que las formas compuestas y descompuestas se traten como equivalentes. La normalización Unicode generalmente se aplica antes de realizar cualquier comparación. Para resumir, para una comparación insensible a mayúsculas y minúsculas, hace algo parecido a lo que haría al comparar cadenas de rango ASCII: aplanar el lado izquierdo y derecho de la comparación "a minúsculas" (por ejemplo), luego compare el array como una matriz binaria. La diferencia es que necesita 1) normalizar las cadenas a la misma forma Unicode (kC o kD) 2) normalizar las cadenas para el mismo caso de acuerdo con las reglas de esa configuración regional 3) normalizar los acentos de acuerdo con el acento -sensitivity rules 4) comparar de acuerdo con una comparación binaria 4) si corresponde, como en el caso de la clasificación, comparar usando reglas secundarias y terciarias adicionales, que incluyen cosas análogas a cosas como "Mc" ordena antes de "M" en algunos idiomas

Y sí, Windows almacena tablas para todas estas reglas. No se obtienen todos de manera predeterminada en todas las instalaciones, a menos que se agregue compatibilidad con la compatibilidad con idiomas asiáticos orientales y scripts complejos desde el panel de control.

+1

Wow. Desearía poder darte más votos. ¡¡Gracias!! –

1

La respuesta correcta es un poco más complicada, dependiendo de lo que esté tratando de hacer.

Al comparar cadenas de caracteres, para ordenar o buscar aplicaciones, se especifica el algoritmo correcto en UTS #10: "Unicode Collation Algorithm". La insensibilidad a mayúsculas y minúsculas es parte de la mezcla, pero hay diferentes formas de representar muchos caracteres y las aplicaciones a menudo deben tratarse las diversas representaciones como equivalentes.

Las reglas de ordenamiento dependen de la configuración regional. Esto es principalmente un problema cuando está ordenando resultados para mostrar a un usuario. Ignorar las reglas puede frustrar a los usuarios e incluso generar vulnerabilidades de seguridad.

Si solo intenta capitalizar palabras con fines de visualización, las reglas allí también pueden ser complicadas; hay conversiones one-to-many y otros problemas. Dependiendo de la configuración regional, la misma letra puede capitalizarse de manera diferente. La posición de la letra en una palabra puede hacer la diferencia. También hay una noción distinta de "caso del título", en la que solo quiere poner en mayúscula la primera letra de cada palabra. A veces, el título de un personaje no es lo mismo que su mayúscula.

Cuestiones relacionadas