visual validar studio primera minusculas mayusculas mayuscula letra funciones convertir cadena unicode string theory low-level uppercase

validar - ¿Cómo se configuran las cadenas en mayúsculas/minúsculas en Unicode?



textbox mayusculas c# (4)

Esta 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 las ruedas).

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 personaje, y si cae dentro del rango [az], sumaría la diferencia entre A y a.

Si no cae en ese rango, tendré una pequeña tabla de equivalencia 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 estoy esperando que no necesitaría parchear 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 cuando se trata de comparar cadenas.

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

¿Alguien sabe las partes internas de estas cosas?

¡Gracias!


Existe 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 las asignaciones de casos de Unicode, consulte: http://www.unicode.org/faq/casemap_charprop.html


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".

Entonces, no hay tantas letras de qué preocuparse. Esta página 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).


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

Al comparar cadenas de caracteres, para ordenar o buscar aplicaciones, el algoritmo correcto que se utiliza se especifica en UTS # 10: "Algoritmo de intercalación Unicode". La insensibilidad a mayúsculas y minúsculas es parte de la combinación, pero existen diferentes formas de representar muchos caracteres, y las aplicaciones a menudo necesitan tratar las distintas representaciones como equivalentes.

Las reglas de clasificación 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 para mostrarlas, 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 clara 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.


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.

Algunos locales 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 de 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: aplana el lado izquierdo y derecho de la comparación "a minúsculas" (por ejemplo), luego compara la matriz como un binario formación. 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 las reglas de sensibilidad al acento 4) comparar de acuerdo con una comparación binaria 4) si corresponde, como en el caso de la clasificación, comparar usando reglas de clasificación secundaria y ternaria adicionales, que incluyen cosas análogas a cosas como "Mc" ordena antes que "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.