Longueur du C++ std::string en octets
J'ai un peu de mal à déterminer la sémantique exacte de std::string.length()
.
Le la documentation indique explicitement que length()
renvoie le nombre de caractères dans la chaîne et pas le nombre d'octets. Je me demandais dans quels cas cela fait une différence.
En particulier, est-ce seulement pour les non-char les instanciations de std::basic_string<>
ou puis-je aussi avoir des ennuis lorsque le stockage des chaînes UTF-8 avec des caractères multi-octets? La norme de permettre length()
être en UTF8?
il est wstring pour l'UTF et là il fait sens que length retourne le nombre de caractères depuis le personnage de la taille peut varier.
Non,
Vérifiez également ce joli fil sur
Non,
wchar_t
a une taille fixe comme n'importe quel autre type. Il ne peut pas magiquement varier.Vérifiez également ce joli fil sur
std::string
vs std::wstring
et quelques trucs à propos d'Unicode: stackoverflow.com/questions/402283/stdwstring-vs-stdstringwstring
n'a rien à voir avec l'encodage UTF. Peut-être que vous pensiez de u16string
ou u32string
?OriginalL'auteur ComicSansMS | 2011-10-12
Vous devez vous connecter pour publier un commentaire.
Lorsque vous traitez avec des non-
char
les instanciations destd::basic_string<>
, bien sûr, la longueur ne correspond pas à un nombre d'octets. Cela est particulièrement évident avecstd::wstring
:Mais
std::string
est d'environchar
caractères; il n'y a pas une telle chose comme un de caractères multi-octets autant questd::string
est concernée, si vous entassés l'un dans les à un niveau élevé ou pas. Donc,std::string.length()
est toujours le nombre d'octets représentée par la chaîne. Notez que si vous êtes multi-octets de bourrage de crâne "caractères" dans unstd::string
, alors votre définition de "caractère" devient tout à coup à l'encontre de celle du conteneur et de la norme.Pas un problème 🙂
Mais
std::string
est d'environchar
caractères, de sorte que la définition de "caractère" en C++ est "un élément d'une chaîne de caractères de type", plutôt que "ce que l'homme voit, codé" ou "unicode codepoint, codé en quelque sorte". Cela semble crédible, mais quelqu'un peut-il citer le chapitre et le verset?C'est moins que la norme dit qu'il ne se soucie pas de l'encodage et de plus à ce sujet ne dit pas que ce n'. Encore,
2.3/1
pourrait être d'intérêt - il définit le "jeu de caractères de base". Et2.3/3
dit:The execution character set and the execution wide-character set are implementation-defined supersets of the basic execution character set and the basic execution wide-character set, respectively. The values of the members of the execution character sets and the sets of additional members are locale-specific.
Oui, lors de la demande pour le chapitre et le verset, vous obtenez le chapitre et le verset. Autre chose que je peux vous aider? 🙂
OriginalL'auteur Lightness Races in Orbit
Si nous parlons spécifiquement sur
std::string
, puislength()
ne retourne le nombre d'octets.C'est parce qu'un
std::string
est unbasic_string
dechar
s, et le Standard C++ définit la taille d'unechar
être exactement un octet.Noter que le Standard ne veut pas dire quel est le nombre de bits dans un octet, mais c'est une autre histoire entièrement et vous n'avez probablement pas de soins.
EDIT: La Norme ne dit qu'une mise en œuvre doit fournir une définition de
CHAR_BIT
qui dit combien de bits dans un octet.Par ailleurs, si vous allez sur une route où vous ne vous préoccuper du nombre de bits dans un octet, vous pourriez envisager de lecture cette.
+1 Pour la dernière phrase, une belle.
La norme définit
CHAR_BIT
, le nombre de bits dans un octet.Vrai, mais le Standard ne veut pas dire ce qui est défini. Quand j'ai dit "ne veut pas dire quel est le nombre de bits dans un octet" je voulais dire de façon précise, unambigious sens. Mais je vais préciser mon post avec une modification, merci de souligner ce point.
OriginalL'auteur John Dibling
Un
std::string
eststd::basic_string<char>
, doncs.length() * sizeof(char) = byte length
. Aussi,std::string
ne sait rien de l'UTF-8, de sorte que vous allez obtenir la taille en octets, même si ce n'est pas vraiment ce que vous êtes après.Si vous avez des données UTF-8 dans un
std::string
, vous aurez besoin d'utiliser autre chose comme Soins intensifs pour obtenir le "réel" de longueur.OriginalL'auteur NuSkooler
cplusplus.com n'est pas "la documentation" pour
std::string
, c'est un pauvre site de qualité, plein de mauvaise qualité de l'information. Le standard C++ définit très clairement:21.1 [strings.général] ¶1
21.4.4 [string.capacité] ¶1
OriginalL'auteur Jonathan Wakely