2009-01-03 7 views
14

Exactement cela: La longueur d'une chaîne est-elle égale à la taille de l'octet? Est-ce important sur la langue?La longueur d'une chaîne est-elle égale à la taille de l'octet?

Je pense que oui, mais je veux juste m'assurer.

Informations supplémentaires: Je me demande simplement en général. Ma situation spécifique était PHP avec MySQL.

Comme la réponse est non, c'est tout ce que j'ai besoin de savoir.

Répondre

46

Non. Une chaîne terminée par zéro a un octet supplémentaire. Une chaîne pascal (la chaîne courte Delphi) a un octet supplémentaire pour la longueur. Et les chaînes Unicode ont plus d'un octet par caractère.

Par unicode, cela dépend de l'encodage. Il peut s'agir de 2 ou 4 octets par caractère ou même d'un mélange de 1,2 et 4 octets.

+0

Dans Delphi shortstring a un octet supplémentaire, mais d'autres types de chaînes a quatre octets supplémentaires. – inzKulozik

+0

Je sais, mais les shortstrings sont appelés chaînes pascal ;-). –

+2

Très belle réponse, courte et douce, droit au but, et comprend les exemples les plus courants du monde réel. –

3

Pas toujours, cela dépend du codage.

6

Cela dépend de ce que vous entendez par "longueur". Si vous voulez dire "nombre de caractères" alors, non, beaucoup de langages/méthodes de codage utilisent plus d'un octet par caractère.

22

Cela dépend entièrement de la plate-forme et de la représentation.

Par exemple, dans .NET, une chaîne prend deux octets dans la mémoire par point de code UTF-16. Cependant, les paires de substitution nécessitent deux valeurs UTF-16 pour un caractère Unicode complet compris entre U + 100000 et U + 10FFFF. La forme en mémoire a également une surcharge pour la longueur de la chaîne et éventuellement un certain remplissage, ainsi que le surdébit normal d'un pointeur de type, etc.

Maintenant, lorsque vous écrivez une chaîne sur le disque (ou la réseau, etc) à partir de .NET, vous spécifiez l'encodage (avec la plupart des classes par défaut à UTF-8). À ce stade, la taille dépend beaucoup de l'encodage. ASCII prend toujours un seul octet par caractère, mais est très limité (pas d'accents, etc.); UTF-8 donne la plage complète Unicode avec un encodage variable (tous les caractères ASCII sont représentés dans un seul octet, mais d'autres prennent plus de caractères). UTF-32 utilise toujours exactement 4 octets pour tout caractère Unicode - la liste continue. Comme vous pouvez le voir, ce n'est pas un sujet simple. Pour déterminer combien d'espace une chaîne va prendre, vous devrez spécifier exactement quelle est la situation - si c'est un objet en mémoire sur une plate-forme (et si oui, quelle plate-forme - potentiellement même jusqu'à la mise en œuvre et les paramètres du système d'exploitation), ou s'il s'agit d'une forme cryptée brute telle qu'un fichier texte, et si oui, en utilisant quel encodage.

+2

Mon quel gâchis nous avons! – Malfist

+1

Et bien sûr, la taille sur le disque change avec/sans nomenclature. Juste pour s'amuser ;-p –

3

Il n'y a pas de réponse unique; cela dépend de la langue et mise en œuvre (rappelez-vous que certaines langues ont plusieurs implémentations!)

chaînes ASCII zéro terminaison occupent au moins un octet que le « contenu » de la chaîne. (D'autres peuvent être alloués, selon la façon dont la chaîne a été créée.)

Les chaînes non terminées par zéro utilisent un descripteur (ou une structure similaire) pour enregistrer la longueur, ce qui prend de la mémoire supplémentaire quelque part.

Les chaînes Unicode (en plusieurs langues) utilisent deux octets par caractère.

Les chaînes d'un magasin d'objets peuvent être référencées via des poignées, ce qui ajoute une couche d'indirection (et plus de données) afin de simplifier la gestion de la mémoire.

2

Vous avez raison. Si vous codez en ASCII, il y a un octet par caractère. Sinon, il s'agit d'un ou plusieurs octets par caractère.

En particulier, il est important de savoir comment cela affecte les opérations de sous-chaîne. Si vous n'avez pas un octet par caractère, s [n] obtient-il le nième octet ou le nième caractère? Obtenir le nième caractère sera inefficace pour un grand n au lieu de constant, comme c'est le cas avec un octet par caractère.

Questions connexes