2009-01-03 9 views
14

Genau das: Ist eine String-Länge gleich der Byte-Größe? Spielt es eine Rolle in der Sprache?Entspricht eine Zeichenfolgenlänge der Bytegröße?

Ich denke es ist, aber ich will nur sicherstellen.

Zusätzliche Informationen: Ich frage mich nur allgemein. Meine spezifische Situation war PHP mit MySQL.

Da die Antwort nein ist, das ist alles was ich wissen muss.

Antwort

46

Nein. Eine nullterminierte Zeichenfolge hat ein zusätzliches Byte. Eine Pascal-Zeichenfolge (die Delphi-Kurzzeichenfolge) hat ein zusätzliches Byte für die Länge. Und Unicode-Strings haben mehr als ein Byte pro Zeichen.

Bei Unicode hängt es von der Codierung ab. Es könnte 2 oder 4 Bytes pro Zeichen oder sogar eine Mischung aus 1,2 und 4 Bytes sein.

+0

In Delphi Shortstring hat ein zusätzliches Byte, aber andere Zeichenfolge Typen hat zusätzliche vier Bytes. – inzKulozik

+0

Ich weiß, aber die Shortstrings heißen Pascal Strings ;-). –

+2

Sehr schöne Antwort, kurz und bündig, direkt auf den Punkt, und enthält die häufigsten Beispiele aus der Praxis. –

3

Nicht immer, es hängt von der Codierung ab.

6

Es hängt davon ab, was Sie mit "Länge" meinen. Wenn Sie "Anzahl der Zeichen" meinen, dann verwenden viele Sprachen/Codierungsmethoden mehr als ein Byte pro Zeichen.

22

Es hängt vollständig von der Plattform und der Darstellung ab.

Zum Beispiel nimmt eine Zeichenfolge in .NET zwei Bytes im Speicher pro UTF-16-Codepunkt. Surrogatpaare benötigen jedoch zwei UTF-16-Werte für ein vollständiges Unicode-Zeichen im Bereich U + 100000 bis U + 10FFFF. Das speicherinterne Formular hat auch einen Overhead für die Länge der Zeichenfolge und möglicherweise eine Auffüllung sowie den normalen Objekt-Overhead eines Typenzeigers usw.

Jetzt, wenn Sie eine Zeichenfolge auf die Festplatte (oder die Netzwerk usw.) von .NET, geben Sie die Kodierung an (die meisten Klassen haben den Standard UTF-8). An diesem Punkt hängt die Größe sehr von der Codierung ab. ASCII nimmt immer ein einzelnes Byte pro Zeichen, ist aber sehr begrenzt (keine Akzente usw.); UTF-8 bietet den vollen Unicode-Bereich mit einer variablen Kodierung (alle ASCII-Zeichen werden in einem einzigen Byte dargestellt, aber andere belegen mehr). UTF-32 verwendet immer genau 4 Bytes für jedes Unicode-Zeichen - die Liste geht weiter.

Wie Sie sehen können, ist es kein einfaches Thema. Um herauszufinden, wie viel Platz eine Zeichenfolge einnehmen soll, müssen Sie genau angeben was die Situation ist - ob es ein Objekt im Speicher auf einer Plattform ist (und wenn ja, welche Plattform - möglicherweise sogar bis auf die Implementierung Betriebssystemeinstellungen), oder ob es sich um ein unverändertes kodiertes Formular wie eine Textdatei handelt, und wenn ja, um welche Kodierung.

+2

Mein was für ein Chaos wir haben! – Malfist

+1

Und natürlich ändert sich die Größe auf der Festplatte mit/ohne eine Stückliste. Nur für zusätzlichen Spaß; -p –

3

Es gibt keine einzige Antwort; es hängt von Sprache und Implementierung (denken Sie daran, dass einige Sprachen mehrere Implementierungen haben!)

Nullterminierter ASCII-Strings mindestens ein Byte mehr als der „Inhalt“ der Zeichenfolge besetzen. (Mehr kann zugeordnet werden, je nachdem, wie die Zeichenfolge erstellt wurde.)

Nicht-Null-terminierten Strings verwenden, um einen Descriptor (oder eine ähnliche Struktur) Länge aufzuzeichnen, die irgendwo zusätzlichen Speicher nimmt.

Unicode-Zeichenfolgen (in verschiedenen Sprachen) verwenden zwei Bytes pro Zeichen.

Strings in einem Objektspeicher können über Handles referenziert werden, wodurch eine Ebene der Indirektion (und mehr Daten) hinzugefügt wird, um die Speicherverwaltung zu vereinfachen.

2

Sie haben Recht. Wenn Sie als ASCII kodieren, gibt es ein Byte pro Zeichen. Andernfalls sind es ein oder mehrere Bytes pro Zeichen.

Insbesondere ist es wichtig zu wissen, wie sich dies auf Teilstringoperationen auswirkt. Wenn Sie kein Byte pro Zeichen haben, erhält s [n] das n-te Byte oder das n-te Zeichen? Das Holen des n-ten Zeichens wird für große n anstelle von konstant ineffizient sein, wie es bei einem Byte pro Zeichen der Fall ist.