Quel est le meilleur type, en C ++, pour stocker la chaîne UTF-8? J'aimerais éviter de rouler ma propre classe si possible. P>
Ma pensée originale était Cela nous amène à Cependant, la plupart des choses semblent utiliser pensées? P> std :: String Code> - Cependant, cela utilise
char code> comme type sous-jacent.
Char code> 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é em> octets. Cela semble indiquer que c'est le mauvais type. P>
std :: basic_string
char code>. Glib, par exemple, utilise
char code>. C ++ 'S
OSTREAM code> S Utiliser
Char CODE>. P>
3 Réponses :
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. P>
J'aime aussi la glib de GTKMM :: Ustring, mais cela ne fonctionne que si vous écrivez une application GTKMM (ou au moins Glibmm). P>
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 code> String code> qui ne fonctionnent pas sont celles telles que Find_one_of code> 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.
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! -). P>
utf-8 est un codage de caractères longueur variable em>. 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. p>
blockQuote>
Si vous avez besoin de pour stocker em> la chaîne UTF-8, je recommanderais d'utiliser std :: basique_string code> prend en charge uniquement les codages de caractères longueur fixe em>. Si vous devez prendre en charge les codages em> de la longueur de la variable EM>, vous pouvez essayer bibliothèque ICU4C . P>
std :: vecteur