est-ce que (w) ifstream supporte différents encodages
Quand je lis un fichier texte pour une chaîne de caractères larges (std::wstring) à l'aide d'un wifstream, le flux d'appui à l'application de différents codages - c'est à dire peut-il être utilisé pour lire par exemple ASCII, UTF-8 et UTF-16 fichiers?
Si non, qu'aurais-je à faire?
(J'ai besoin de lire le fichier en entier, si cela fait une différence)
source d'informationauteur peterchen
Vous devez vous connecter pour publier un commentaire.
C++ prend en charge l'encodage des caractères par le biais de
std::locale
et la facettestd::codecvt
. L'idée générale est qu'unlocale
objet décrit les aspects du système qui peuvent varier d'une culture à l'autre, (l'homme) de la langue. Ces aspects sont décomposées enfacet
qui sont des arguments de modèle qui définissent la manière dont la localisation des objets dépendants (inclure les flux e/S) sont construits. Quand vous lisez à partir d'unistream
ou écrire à unostream
l'écriture réel de chaque personnage est filtré par les paramètres régionaux de facettes. Les facettes de couvrir non seulement le codage d'Unicode types, mais ces fonctionnalités variées que la façon dont un grand nombre sont écrites (par exemple, avec les virgules ou les points), les devises, l'heure, la capitalisation, et une foule d'autres détails.Cependant, juste parce que les installations existent encodages ne signifie pas que la bibliothèque standard gère en fait tous les encodages, ni de code simple à réaliser. Même ces choses de base comme la taille de caractère, vous devriez être en train de lire (sans parler de l'encodage) est difficile, comme
wchar_t
peut être trop petit (modificateur de vos données), ou trop grand (gaspiller de l'espace), et le plus commun des compilateurs (par exemple, Visual C++ et C++ de Gnu) ne diffèrent sur la façon dont leur mise en œuvre. Donc, vous aurez généralement besoin de trouver des bibliothèques externes pour faire le codage réel.Le plus simple exemple je peux trouver qui couvre toutes les bases, est de Stimuler la UTF-8 facette codecvtavec un exemple qui essaie notamment d'encoder en UTF-8 (UCS4) pour une utilisation par IO ruisseaux. Ça ressemble à ça, bien que je ne suggère pas que de le copier mot à mot. Il faut un peu plus de creuser dans la source à comprendre (et je ne prétends pas):
Pour comprendre plus au sujet de paramètres régionaux, et la façon dont ils utilisent les facettes (y compris
codecvt
), jetez un oeil à ce qui suit:ifstream
ne se soucie pas de l'encodage du fichier. Simplement, il lit les caractères(octets) à partir d'un fichier.wifstream
lit large octets(wchar_t
), mais il ne sait rien au sujet d'encodage de fichier.wifstream
est assez bon pour UCS-2 — fixe-longueur de codage de caractères Unicode (chaque personnage représenté avec deux octets).Vous pouvez utiliser IBM Soins intensifs bibliothèque de traiter les fichiers Unicode.
La conception de la chaîne de caractères larges et large de flux de caractères pré-dates de l'UTF-8, UTF-16 et Unicode. Si vous souhaitez obtenir des techniques, le standard de la chaîne et le flux standard ne sont pas nécessairement fonctionner sur de l'ASCII (c'est juste que, fondamentalement, tous les ordinateurs y utiliser l'ASCII; vous pourriez potentiellement avoir un EBCDIC de la machine).
Raymond Chen une fois a écrit une série illustrant comment travailler avec différents caractères larges flux/types de chaînes.