Localisation des chaînes de caractères




La localisation des chaînes de caractères dans c ++

Le grand nombre d'échantillons de code avec des chaînes de C / C ++ (dans toutes les sources publiées) Il fonctionne avec des réseaux zéro terminaux (ASCIZ) éléments carbonisent (dans le style de C), ou une chaîne de type à réservoir (dans le style de C ++), construit comme un add-on de tels tableaux. Tout cela fonctionne à merveille avec des cordes latine (Anglais) caractères, mais peut faire des courses sur les lignes, contenant des symboles de l'alphabet en langues étrangères (russe, chinois, Arabe et en hébreu). Il n'y a pas aussi simple que cela ... et très mal décrits dans la littérature, qui est compréhensible: auteurs anglophones accordent peu d'attention aux questions de localisation des langues étrangères, et auteurs nationaux, en majorité, la réécriture et l'adaptation des publications en langue anglaise, ne faites pas attention à cet aspect de la question.

langage C - un langage de programmation très ancienne, et C ++ hérite de formate et contraint par les exigences de compatibilité syntaxique avec C. à, ne pas avoir un C / C ++ problème avec ces lignes (appelé localisée) vous avez besoin de comprendre ce qui se passe avec ces ... Localisations

historique, symboles (carboniser) soumis (1963 année) standard ASCII plus jeune 7 les bits d'un octet, tandis que 8 bits supérieur destiné à un contrôle d'erreur, produite pendant le transfert de données. Ce codage permet de coder possible 128 différents symboles, et ce nombre est à peine suffisant pour les caractères de l'alphabet anglais (petits et grands), numérique (Code 0x30-0x39), gestionnaires (moins de code 0x20) et des caractères spéciaux. En ce qui concerne la soumission des alphabets nationaux, tapez la table de caractères alternatif, tels que KOI-7 pour la langue russe. Le passage à une table flux d'entrée-sortie pour symbole alternatif par le symbole avec le code 0x18 (le code est appelé: Contrôle de l'appareil 2) dans le courant, et revenir à la table principale ASCII - le symbole avec le code 0x17 (Contrôle de l'appareil 1).

plus tard, depuis les milieu des années 80, avec le temps IBM PC répandu et les remplacer d'autres familles d'ordinateurs, ASCII standard a été prolongée par le 8ème bit byte char, octet peut représenter 256 caractères: junior 127 représente la table ASCII originale (avec l'alphabet latin), et plus - alphabet national. mais, étant donné que les alphabets nationaux peuvent être diverses, est de soutenir chacun d'entre eux a été nécessaire pour entrer dans une page de code, par exemple, pour la langue russe, cela pourrait être la page CP-866 (MS в), CP-1251 (в de Windows), Non-8R (в UNIX, Linux) - et chacune de ces pages offre son, caractérisé par d'autres, l'ordre des caractères russes. ainsi, pour l'affichage correct (ou le décodage) une chaîne de caractères localisée, il est nécessaire de connaître la page de code dans lequel il est présenté.

à, de mettre fin à cette Babel de pages de code de langue, Il a été proposé (1991ville) représentation standard UNICODE, dans lequel le système de codage, chaque caractère est codé valeur de 32 bits (4 octet, mais pas toutes les valeurs 32 bits sont valides). Cette norme permet de coder un grand nombre de caractères de différents systèmes d'écriture. documents, codée standard UNICODE, peut comprendre un seul texte les caractères japonais et chinois, lettres latines, cyrillique, alphabet grec (un, e, Je, Fr., p, l, fa, Oh ...), symboles mathématiques, la notation musicale, symboles musicaux, symboles éteints, rare, peuples exotiques. Il n'y a pas besoin de changer la page de code. par exemple, Voici les quelques-uns des symboles de la langue, désigné comme “singaliskii”:

La première norme UNICODE a été libéré dans la 91 e année. Dernière au moment - en 2017 et il décrit 136755 différents symboles.

Mais UNICODE - est toujours seule représentation standard de chaque caractère. Pour représenter ce personnage dans un système d'exploitation particulier (ou le langage de programmation) besoin de plus système de codage de caractères Unicode.

  • système de codage est largement utilisé:
    UTF-32 - utilisé pour représenter chaque caractère 4 octet, La valeur numérique directe code UNICODE
  • UTF-32 - pour représenter les symboles les plus couramment utilisés 2 octet (premier 65536 positions), et le reste sous la forme d'un « paires de substitution ». Ce codage est utilisé sur les systèmes d'exploitation de Windows à partir de Windows NT.
  • UTF-32 - pour représenter chaque caractère utilise une séquence de longueur variable d'octets: à partir de 1 octets pour les caractères ASCII de la table principale, à 6 octet pour les caractères rarement utilisés (caractères de l'alphabet russe sont codés avec 2 octets). Ce codage a été créé plus tard que les autres systèmes d'exploitation pour le Plan 9 et Inferno en 1992. Ken Thompson et Robert Pike avec des collègues, et il est entré comme un codage unique et essentiel des chaînes de caractères dans la suite des langages de programmation Python et Go. Ce codage est utilisé, aujourd'hui, partout, dans les systèmes d'exploitation POSIX / UNIX, Linux.

De retour à la, que C / C ++ ancienne famille des langages de programmation, pour les représenter en caractères localisés nécessaires pour introduire un nouveau type de données - caractères larges wchar_t au lieu de char (le type de données est apparu dans la norme C89, mais, pleinement avec le soutien de l'API, Seulement dans la norme C99). Au lieu de la ligne C des fonctions de la bibliothèque sous forme str *() pour une large offrir à leurs homologues complètes, mais comme WCS *() (au lieu du préfixe préfixe str écriture WCS). Différents systèmes peuvent avoir différents bits wchar_t (sous Linux est int32_t, в de Windows int16_t) mais pour un programmeur qui n'a pas d'importance et ne crée pas de différences.

Pour le travail et la conversion des séquences multi-octets enregistrés dans le codage UTF-8 en C / C ++ introduit famille de fonctions mb *(): mbtowc(), mblen(), mbstowcs(), wcstombs() et al. Il est un mécanisme de conversion mutuelle entre tableau de caractères[] (qui a également exprimé des chaînes de caractères UTF-8) и wchar_t[]. Si vous n'êtes pas face à l'encodage UTF-8 (qui se produit probablement dans Windows), alors ce groupe de fonctions vous ne devriez pas prendre.

De même,, classe à la place de conteneurs C ++ classe chaîne introduit un conteneur similaire caractères larges wstring.

Plus précisément sur la technique des chaînes larges localisées seront discutées dans le prochain article. Entre-temps, le 1er exemple élémentaire ... sans commentaire - comme une occasion de réflexion (identifier et expliquer, que l'appel strlen() dans chaque cas, donne le nombre d'octets dans une chaîne ne correspond pas visuellement nombre apparent de lettres dans ce):

P.S. Avec les détails sur la localisation en C / C ++ et les chaînes localisées, qui sont intéressés plus en détail, peut être lu ici: localisation Langue de C / C ++ localisation Langue de C / C ++ - il y a une explication plus 22 pages de formats de documents de bureau.

Bulletin de nouvelles leçons sur la programmation:

Localisation des chaînes de caractères
3.6 (72%) 5 votes

Sur huile

une expérience pratique sur le développement de logiciels 40 ans. société de logiciels internationale Global Teacher Logic. IBM Developer Works auteur permanent des publications. éditeur scientifique de l'ordinateur littérature maison d'édition "Symbole-Plus", Saint-Pétersbourg.

2 réflexions sur "Localisation des chaînes de caractères

  1. Certaines caractéristiques des lignes avec le russe, qui ne sont pas décrits en considérant les lignes généralement carbonisent, Ils seront discutés dans les articles suivants dans la suite de ce thème.
    garder…

Laisser un commentaire

Votre adresse email ne sera pas publiée. les champs requis sont indiqués *