Question

Quelle est la différence entre UTF et UCS.

Quels sont les meilleurs moyens de représenter des jeux de caractères non européens (en utilisant UTF) dans des chaînes C ++. J'aimerais connaître vos recommandations pour:

  • Représentation interne dans le code
    • Pour la manipulation de chaîne au moment de l'exécution
    • Pour utiliser la chaîne à des fins d'affichage.
  • Meilleure représentation de stockage ( i.e. dans le fichier)
  • Format de transport optimal (transfert entre applications pouvant appartenir à différentes architectures et avoir des paramètres régionaux différents)
Était-ce utile?

La solution

  

Quelle est la différence entre UTF et UCS.

Les codages UCS ont une largeur fixe et sont marqués par le nombre d'octets utilisés pour chaque caractère. Par exemple, UCS-2 nécessite 2 octets par caractère. Les caractères dont les points de code sont en dehors de la plage disponible ne peuvent pas être codés avec un codage UCS.

Les codages UTF ont une largeur variable et sont marqués par le nombre minimal de bits permettant de stocker un caractère. Par exemple, UTF-16 nécessite au moins 16 bits (2 octets) par caractère. Les caractères avec de grands points de code sont codés en utilisant un plus grand nombre d'octets, soit 4 octets pour les caractères astraux en UTF-16.

  
      
  • Représentation interne dans le code
  •   
  • Meilleure représentation du stockage (dans le fichier)
  •   
  • Format de transport optimal (transfert entre applications pouvant   être sur différentes architectures et ont   paramètres régionaux différents)
  •   

Pour les systèmes modernes, le codage de stockage et de transport le plus raisonnable est UTF-8. Il existe des cas particuliers où d'autres pourraient être appropriés: UTF-7 pour les anciens serveurs de messagerie, UTF-16 pour les éditeurs de texte mal écrits, mais UTF-8 est le plus courant.

La représentation interne préférée dépend de votre plate-forme. Sous Windows, il s’agit du format UTF-16. Sous UNIX, il s’agit de UCS-4. Chacun a ses bons points:

  • Les chaînes UTF-16 n'utilisent jamais plus de mémoire qu'une chaîne UCS-4. Si vous stockez de nombreuses grandes chaînes avec des caractères principalement dans le plan multilingue de base (BMP), UTF-16 nécessitera beaucoup moins d’espace que UCS-4. En dehors du BMP, il utilisera le même montant.
  • UCS-4 est plus facile à raisonner. Étant donné que les caractères UTF-16 peuvent être divisés en plusieurs "paires de substitution", il peut s'avérer difficile de fractionner ou de restituer correctement une chaîne. Le texte UCS-4 n'a pas ce problème. UCS-4 agit également un peu comme le texte ASCII dans "char". tableaux, afin que les algorithmes de texte existants puissent être facilement portés.

Enfin, certains systèmes utilisent UTF-8 comme format interne. Cela est utile si vous devez interagir avec des systèmes ASCII ou ISO-8859 existants, car les octets NULL ne sont pas présents au milieu du texte UTF-8. Ils sont au format UTF-16 ou UCS-4.

Autres conseils

Je suggérerais:

  • Pour une représentation dans le code, wchar_t ou son équivalent.
  • Pour la représentation de stockage, UTF-8.
  • Pour une représentation filaire, UTF-8.

L’avantage de UTF-8 dans les situations de stockage et de connexion est que l’endianité de la machine n’est pas un facteur. L'avantage d'utiliser un caractère de taille fixe tel que wchar_t dans le code est que vous pouvez facilement trouver la longueur d'une chaîne sans devoir la scanner.

UTC est le temps universel coordonné et non un jeu de caractères (je n'ai trouvé aucun jeu de caractères appelé UTC).

Pour la représentation interne, vous pouvez utiliser wchar_t pour chaque caractère et std :: wstring pour les chaînes. Ils utilisent exactement 2 octets pour chaque caractère. La recherche et l’accès aléatoire seront donc rapides.

Pour le stockage, si la plupart des données ne sont pas au format ASCII (code = 128), vous pouvez utiliser le format UTF-16, qui est presque identique à wstring et . wchar_t .

Etant donné qu'UTF-16 peut être petit ou grand endian, pour le transport de fil, essayez de le convertir en UTF-8, indépendant de l'architecture.

Dans la représentation interne dans le code, vous feriez mieux de le faire pour les caractères européens et non européens:

\ uNNNN

Les caractères compris entre \ u0020 et \ u007E, ainsi qu'un peu d'espace (par exemple, fin de ligne) peuvent être écrits sous forme de caractères ordinaires. Si vous écrivez ce caractère au-dessus de votre choix, par exemple, il ne sera compilé que dans votre page de code (par exemple, OK en France mais en Russie, OK en Russie mais en Japon, OK en Chine, mais aux États-Unis, etc. .).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top