Comment définissez-vous des chaînes de caractères majuscules / minuscules dans Unicode?
C'est surtout une question théorique, je suis juste très curieux. (Je ne suis pas en train de ce faire par le codage de moi-même ou quoi que ce soit, je ne suis pas réinventer la roue.)
Ma question est de savoir comment les majuscules/minuscules tableau d'équivalence des œuvres pour l'Unicode.
Par exemple, si j'avais à le faire en ASCII, je voudrais prendre un personnage, et si elle tombe dans les [a-z], j'aurais de la somme, la différence entre Un et un.
Si ça ne tombe pas sur cette gamme, j'aurais un petit tableau d'équivalence pour les 10 ou si les caractères accentués en plus -.
(Ou, je pourrais juste avoir une équivalence complète de la matrice de 256 entrées, la plupart de ce qui serait le même que l'entrée)
Cependant, j'imagine qu'il y a une meilleure façon de spécifier les équivalences en Unicode, étant donné qu'il y a des centaines de milliers de caractères, et que, théoriquement, une nouvelle langue ou un ensemble de caractères peut être ajouté (et je m'attends à ce que vous n'avez pas besoin de patch windows quand ça arrive).
Windows ont un énorme codée en dur de l'équivalence de la table pour chaque personnage? Ou comment cela est-il mis en œuvre?
Une question connexe est de savoir comment SQL Server implémente basé sur Unicode accents et de la casse des requêtes. A-t-elle une table interne qui lui dit que é ë è E É È et Ë sont tous équivalent à "e"?
Qui ne sonne pas très rapide quand il s'agit de comparer des chaînes de caractères.
Comment est-il accès Indices rapidement? Est-il déjà valeurs de l'indice de convertis à leur "base", les caractères, correspondant au champ du classement?
Personne ne sait le fonctionnement interne de ces choses?
Merci!
"un petit tableau d'équivalence pour les 10 ou si les caractères accentués plus -" -- vous aurez à comprendre que les "petits" qui signifie qu'environ 100 fois plus grand que tu le pensais.
Je ne suis pas entièrement sûr que je comprends pourquoi toutes les variantes de e que je ne peut pas taper avec mon clavier facilement tous égaux "e". Je peux le comprendre, à partir d'une base de données de point de vue (pour la recherche en ignorant des accents particuliers), mais d'un point de vue de la langue que ceux sont tous des caractères différents...
pourquoi vous parlez toujours de "windows ...", lorsque votre question est théorique? si vous voulez un bon algorithme, ne pas exect quelque part dans certains OS, mais la recherche d'une bibliothèque unicode ou tout simplement pour l'algorithme. désolé, mais cette question sonne un peu comme "je sais que windows ne les choses, donc il faut le faire"...
OriginalL'auteur Daniel Magliola | 2008-11-18
Vous devez vous connecter pour publier un commentaire.
Il existe un mappage de fichier qui contient tous les mappages qui ont un mappage 1:1 ratio. Généralement les systèmes d'exploitation/frameworks/librairies soutien d'une version spécifique de l'Unicode, et depuis cette affaire mappages de fichier est versionné, vous obtenez les mappages pour quelle que soit la version d'Unicode votre OS/cadre/bibliothèque/qu'est-il arrivé à l'appui.
Pour plus d'informations sur Unicode cas mappages, voir: http://www.unicode.org/faq/casemap_charprop.html
OriginalL'auteur Jason Coco
Je vais traiter le Serveur MS SQL partie de cette question, mais la réponse "correcte" dépend en réalité de la langue(s) pris en charge et d'application.
Lorsque vous créez une table dans SQL Server, chaque champ de texte a soit une, implicitement ou explicitement, classement spécifié. Cela affecte à la fois l'ordre de tri et de comparaison de comportement. La valeur par défaut, pour la plupart des anglais (états-unis) paramètres régionaux, sera Latin1_General_CI_AS, ou Latin 1, de la casse, des Accents. Cela signifie que, par exemple, a=a, mais un!=Ä un!=ä. Vous pouvez également utiliser les accents (Latin1_General_CI_AI) qui traite tous les diacritiques des variations de "A" comme égaux.
Certains paramètres régionaux de soutien à d'autres catégories de comparaison; le français, par exemple, des ordres de mots contenant des signes diacritiques un peu différemment que les allemands n'. Turc considère un sans point i et parsemée je sémantiquement différents, de sorte que je l'ai et je n'ai pas de match, même avec de la casse, des comparaisons si vous utilisez turc, de la casse, des accents de classement.
Vous pouvez modifier le classement par base de données, par table, par domaine, et, avec un certain coût, même par requête. Ma compréhension est que les indices de normaliser selon le classement spécifié ordre, ce qui signifie que, fondamentalement, l'indice maintient une version aplatie de la chaîne d'origine. Par exemple, avec de la casse, les classements, Apple et apple sont stockés comme apple. Les requêtes sont aplaties avec le même classement avant la recherche.
En Japonais, il y a une autre catégorie de normalisation, où fullwidth et halfwidth personnages comme ア=ア, et, dans certains cas, deux halfwidth personnages sont ramenés à un seul, sémantiquement équivalent de caractères (バ=バ). Enfin, pour certaines langues, il y a une autre boule de cire avec du composite personnages, où isolé caractères diacritiques peuvent être composées avec d'autres caractères (par exemple, le tréma dans ä est un caractère, composé avec la forme simple d'une). Vietnamiens, Thaïlandais et quelques autres langues ont des variations de cette catégorie. Si il y a une forme canonique, la normalisation Unicode permet la compose et décompose les formes pour être considérées comme équivalentes. La normalisation Unicode est généralement appliquée avant tout les comparaisons sont faites.
Pour résumer, pour une comparaison sensible à la casse, vous faire quelque chose de beaucoup comme vous le feriez lors de la comparaison ASCII-plage de chaînes: aplatir le côté gauche et droit de la comparaison "minuscules" (par exemple), puis de comparer le tableau comme un tableau binaire. La différence est que vous devez
1) normaliser les cordes de la même forme unicode (kC et kD)
2) normaliser les chaînes de caractères dans le même cas, selon les règles de ce jeu de paramètres régionaux
3) normaliser les accents selon les accents règles
4) comparer selon une comparaison binaire
4) le cas échéant, comme dans le cas du tri, de la comparaison à l'aide d'un deuxième et ternaires règles de tri, qui comprennent des choses analogues à des choses comme "Mc" trie avant de "M" dans certaines langues.
Et oui, Windows stocke les tables pour l'ensemble de ces règles. Vous n'obtenez pas tous d'entre eux par défaut dans chaque installation, sauf si vous ajoutez le support avec l'Orient le Support des Langues Asiatiques et des Scripts Complexes de soutien de panneau de contrôle.
OriginalL'auteur JasonTrue
La plupart des systèmes d'écriture ne disposent pas de majuscules et de minuscules. Selon Wikipedia, les exceptions comprennent "Romain, grec, Cyrillique et l'alphabet arménien".
Donc il n'y a pas beaucoup de lettres à s'inquiéter. Cette page montre que les grandes plages de caractères de suivre un schéma simple d'ajouter 1 à un caractère majuscule pour obtenir l'équivalent en bas de casse (même si bien sûr il y a quelques exceptions).
OriginalL'auteur Artelius
La bonne réponse est un peu plus compliqué, en fonction de ce que vous essayez de faire.
Lorsque l'on compare les chaînes de caractères, de tri ou de recherche d'applications, l'algorithme correct à utiliser est spécifié dans UT #10: "Unicode Collation Algorithm". l'insensibilité à la casse fait partie du mélange, mais il y a différentes façons de représenter un grand nombre de caractères, et les applications doivent souvent traiter les différentes représentations que l'équivalent.
Les règles de tri sont dépendant de paramètres régionaux. C'est principalement une question quand vous êtes de tri pour l'affichage des résultats à l'utilisateur. Ignorant les règles peuvent incommoder les utilisateurs et même provoquer des failles de sécurité.
Si vous êtes juste essayer de profiter des mots à des fins d'affichage, les règles, il peut être difficile de trop; il y a un-à-beaucoup de conversions et d'autres questions. Selon les paramètres régionaux, la même lettre peut capitaliser différemment. La position de la lettre dans un mot peut faire une différence. Il y a aussi une nette notion de "titre", où vous voulez juste pour mettre en majuscule la première lettre de chaque mot. Parfois, le titre-cas d'un caractère n'est pas le même que sa majuscule.
OriginalL'auteur erickson