8
votes

Meilleur type pour les données UTF-8?

Quel est le meilleur type, en C ++, pour stocker la chaîne UTF-8? J'aimerais éviter de rouler ma propre classe si possible.

Ma pensée originale était std :: String - Cependant, cela utilise char comme type sous-jacent. Char peut être non signé ou signé - il varie. Sur mon système, il est signé. Les unités de code UTF-8 sont toutefois non signé octets. Cela semble indiquer que c'est le mauvais type.

Cela nous amène à std :: basic_string - qui semble correspondre à la facture: non signé, caractères 8 bits (ou plus).

Cependant, la plupart des choses semblent utiliser char . Glib, par exemple, utilise char . C ++ 'S OSTREAM S Utiliser Char .

pensées?


0 commentaires

3 Réponses :


9
votes

J'utiliserais simplement STD :: String, car il est cohérent avec l'idéal UTF-8 Idéal de traitement des données, comme vous seriez dénoncé des chaînes ASCII, à moins que vous n'ayez réellement besoin de leur unicode-ness.

J'aime aussi la glib de GTKMM :: Ustring, mais cela ne fonctionne que si vous écrivez une application GTKMM (ou au moins Glibmm).


3 commentaires

Le seul problème réel avec l'utilisation de STD :: String est que certains opérateurs qui s'attendent à travailler sur des caractères pourraient réellement finir par faire face à des caractères partiels, car l'UTF-8 est un codage multibyte. Par exemple, l'utilisation de l'opérateur [] serait cassée pour obtenir des "caractères" en plus de la longueur de la chaîne ne pas être directement accessible. (La taille est disponible, mais pas de longueur).


Il vous suffit de penser à une chaîne étant une gamme d'unités de code au lieu d'un tableau de caractères. Ensuite, les fonctions de membre String qui ne fonctionnent pas sont celles telles que Find_one_of qui prennent un ensemble de caractères comme argument.


@Évan: la définition de "caractères" et "longueur" sont si complexes dans Unicode (en raison de la combinaison et des ligatures et des trucs), qu'ils ne seront jamais directement accessibles. C'est un peu mieux de ne pas prétendre qu'ils sont.



7
votes

J'ai toujours juste utilisé STD :: String, moi-même - d'une manière ou d'une autre, la question philosophique "signée" vs "non signée" à peu près ne se présente jamais comme problématique dans un tel contexte (codeurs et décodeurs vers / depuis UTF-8 sont des choses que vous écrivez seulement rarement, après tout; dans un contexte d'application, vous utilisez simplement la ficelle STD :: String comme "boîte noire" de TRES! -).


0 commentaires

4
votes

utf-8 est un codage de caractères longueur variable . std :: basique_string prend en charge uniquement les codages de caractères longueur fixe . Si vous devez prendre en charge les codages de la longueur de la variable , vous pouvez essayer bibliothèque ICU4C .

L'ICU est un ensemble mature et largement utilisé de bibliothèques C / C ++ et Java fournissant une prise en charge de l'Unicode et de la mondialisation aux applications logicielles. L'ICU est largement portable et donne aux applications les mêmes résultats sur toutes les plateformes et entre le logiciel C / C ++ et Java.

Si vous avez besoin de pour stocker la chaîne UTF-8, je recommanderais d'utiliser std :: vecteur . Cela indiquera que vous ne pouvez pas effectuer les opérations de chaîne réelles (qui pourraient être incorrectes) sur les données stockées.


0 commentaires