Comment écrire un std::string en un fichier texte UTF-8
Je veux juste écrire quelques lignes dans un fichier texte en C++, mais je veux qu'ils soient encodés en UTF-8. Quelle est la méthode la plus simple et la manière simple de le faire?
- C'est fou ce que les mst bibliothèque n'est pas en mesure de traiter avec de l'utf-8. C'est pourquoi nous avons à traiter des tonnes de conversions entre l'échelle de cordes et de chaînes d'octets avec certains maladroits locale. Pourquoi il n'y a pas après toutes ces années, quelque chose comme std::utf8string?
- parce que le C/C++ doivent être compatibles avec les matériels existants? 😛
Vous devez vous connecter pour publier un commentaire.
La seule façon de l'UTF-8 affecte
std::string
est quesize()
,length()
, et tous les indices sont mesurés en octets, pas de caractères.Et, comme le sbi le souligne, l'incrémentation de l'itérateur fournie par
std::string
sera pas en avant par octet, non pas de par son caractère, de sorte qu'il peut réellement de point vers le milieu de la séquence multi-octets UTF-8 codepoint. Il n'y a pas UTF-8-connaissance des itérateurs fournis dans la bibliothèque standard, mais il y a quelques disponibles sur le Net.Si vous vous souvenez de cela, vous pouvez mettre UTF-8 dans
std::string
, de l'écrire dans un fichier, etc. tous de la manière habituelle (je veux dire de la façon dont vous devriez utiliser unstd::string
sans UTF-8 à l'intérieur).Vous voudrez peut-être commencer votre fichier avec une marque d'ordre des octets, de sorte que d'autres programmes savez c'est de l'UTF-8.
std::string
de tenir invalide utf8 codepoints.std::string
qui détient UTF-8.std::string
est capable de maintenir en UTF-8. La question est de demander une recommandation de conception, pas pour aider à la fixation d'une conception existante.Il est agréable de minuscules bibliothèque pour travailler avec de l'utf-8 à partir de c++: utfcpp
libiconv est une grande bibliothèque pour tous nos encodage et le décodage des besoins.
Si vous utilisez Windows, vous pouvez utiliser WideCharToMultiByte et précisez que vous souhaitez UTF8.
La plus intuitive et donc plus facile la manipulation de l'utf8 en C++ est sûre à l'aide d'un baisse-dans le remplacement pour
std::string
.Comme l'internet en manque encore une, je suis allé à mettre en œuvre la fonctionnalité sur mon propre:
tinyutf8 (EDIT: maintenant, Github).
Cette bibliothèque fournit une très légère baisse en preplacement pour
std::string
(oustd::u32string
si vous voulez, parce que vous parcourez codepoints plutôt que chars). Ité est mis en œuvre avec succès dans le milieu entre un accès rapide et petite consommation de mémoire, tout en étant très robuste. Cette robustesse 'invalide' UTF8-séquences fait (presque complètement) compatible avec la norme ANSI (0-255).Espérons que cette aide!
Si par "simple" tu veux dire que l'ASCII, il n'y a pas besoin de faire de n'importe quel encodage, puisque les caractères de la table ASCII 127 ou moins le même en UTF-8.
Ma préférence est pour convertir un std::u32string et de travailler avec codepoints en interne, puis de les convertir en utf8 lors de l'écriture d'un fichier à l'aide de ces la conversion des itérateurs j'ai mis sur github.
Utilisation Glib::ustring de glibmm.
C'est la seule répandue chaîne UTF-8 conteneur (autant que je sache). Alors que le glyphe (pas fort), il a les mêmes signatures de méthode comme
std::string
de sorte que le port doit être simple de rechercher et de remplacer (assurez-vous que vos données sont en UTF-8 valide avant de les charger dans unustring
).Comme de l'UTF-8 est multibite chaînes de caractères et si vous obtenez des problèmes de travail et c'est une mauvaise idée que de/au Lieu normal d'utilisation de l'Unicode.
Donc par mon avis le mieux est d'utiliser l'ordinaire caractères ASCII dans le fichier texte avec un certain codding ensemble. Besoin d'utiliser Unicode si vous utilisez plus de 2 ensembles de symboles différents
(les langues) unique.
C'est plutôt rare. Dans la plupart des cas assez 2 ensembles de symboles. Pour ce cas utiliser des caractères ASCII, et non Unicode.
Effet de l'utilisation de multibute caractères comme UTF-8, vous obtenez seulement la Chine traditionnelle, en arabe ou dans certains texte hiéroglyphique. C'est très très rare!!!
Je ne pense pas qu'il y a beaucoup de peuples besoins. Donc, ne jamais utiliser l'UTF-8!!! C'est éviter de forts maux de tête de manipuler de telles chaînes.