Was zum Teufel ist eine Perl-Zeichenfolge überhaupt?

8

Ich kann keine grundlegende Beschreibung finden, wie Zeichenketten in Perl gespeichert werden! Es ist wie die gesamte Dokumentation angenommen, dass ich das aus irgendeinem Grund bereits weiß. Ich weiß über encode (), decode (), und ich weiß, ich kann rohe Bytes in eine Perl- "Zeichenfolge" lesen und sie wieder ausgeben, ohne Perl mit ihnen zu verschrauben. Ich weiß über offene Modi. Ich nehme auch an, dass Perl ein interales Format verwenden muss, um Zeichenfolgen zu speichern und zwischen Zeichen- und Binärdaten zu unterscheiden. Bitte wo ist das dokumentiert ???

Gleichwertige Frage ist; Dieses Perl gegeben:

%Vor%

Decode zu was und von was?

Soweit ich es beurteilen kann, muss ein Flag in der String-Datenstruktur vorhanden sein, das besagt, dass dies binäre XOR-Zeichendaten sind (eines internen Formats, das BTW eine Obermenge von Unicode ist - Ссылка ). Aber ich würde es mögen, wenn das in den Unterlagen steht oder hier bestätigt / diskreditiert wird.

    
spinkus 02.03.2013, 05:09
quelle

5 Antworten

15

Das ist eine großartige Frage. Um zu untersuchen, können wir etwas tiefer tauchen, indem wir Devel :: Peek verwenden, um zu sehen, was tatsächlich in unseren Strings gespeichert ist ( oder andere Variablen).

Zuerst müssen wir mit einer ASCII-Zeichenfolge beginnen

%Vor%

Dann können wir Unicode-IO-Layer aktivieren und dasselbe tun

%Vor%

Von dort können wir versuchen, einige breite Zeichen manuell hinzuzufügen

%Vor%

Daraus kann man klar erkennen, dass Perl dies korrekt als utf8 interpretiert hat. Das Problem ist, dass, wenn ich die Oktette nicht mit dem \x{} -Entfernen gebe, sieht die Darstellung mehr wie die reguläre Zeichenfolge

aus %Vor%

All Perl sieht Bytes und hat keine Möglichkeit zu wissen, dass Sie sie als Unicode-Zeichen verstanden haben, anders als bei der Eingabe der oben genannten Escape-Oktetts. Jetzt können wir decode verwenden und sehen, was passiert

%Vor%

TADA !, jetzt können Sie sehen, dass die Zeichenfolge intern korrekt dargestellt wird und mit der Eingabe übereinstimmt, die Sie bei der Verwendung von \x{} escaping eingegeben haben.

Die eigentliche Antwort lautet: "Dekodierung" von Byte zu Zeichen, aber ich denke, es macht mehr Sinn, wenn Sie die Peek-Ausgabe sehen.

Schließlich können Sie Perl dazu bringen, Ihren Quellcode als utf8 zu sehen, indem Sie das Pragma utf8 verwenden, wie zB

%Vor%     
Joel Berger 02.03.2013, 06:04
quelle
6

Ähnlich wie der String- / Zahlenstatus seiner Skalarvariablen ist das interne Format von Perls Strings variabel und hängt vom Inhalt des Strings ab.

Sehen Sie sich perluniintro an, wo dies steht.

  

Intern verwendet Perl derzeit entweder den nativen 8-Bit-Zeichensatz der Plattform (z. B. Latin-1), der standardmäßig UTF-8 verwendet, um Unicode-Zeichenfolgen zu codieren. Wenn alle Codepunkte in der Zeichenfolge 0xFF oder weniger sind, verwendet Perl den systemeigenen 8-Bitzeichensatz. Andernfalls wird UTF-8 verwendet.

Das bedeutet, dass eine Zeichenkette wie "I have £ two" als (Bytes) I have \x{A3} two gespeichert wird. (Das Nummernzeichen ist U+00A3 .) Wenn ich nun eine Multibyte-Unicode-Zeichenkette wie U+263A - ein lächelndes Gesicht - anschließe, konvertiert Perl die gesamte Zeichenkette in UTF-8, bevor es das neue Zeichen anfügt (Bytes ) I have \xC2\xA3 two\xE2\x98\xBA . Wenn Sie dieses letzte Zeichen wieder entfernen, wird die Zeichenfolge UTF-8 als 'I have \xC2\xA3 two codiert.

Aber ich frage mich, warum du das wissen musst. Wenn Sie nicht eine XS-Erweiterung in C schreiben, ist das interne Format transparent und für Sie unsichtbar.

    
Borodin 02.03.2013 06:21
quelle
3

Kurze Antwort: Es ist ein Durcheinander Etwas länger: Der Unterschied ist für den Programmierer nicht sichtbar.

Grundsätzlich müssen Sie daran denken, ob Ihre Zeichenfolge Bytes oder Zeichen enthält, wobei die Zeichen Unicode-Codepunkte sind. Wenn Sie nur auf ASCII stoßen, ist der Unterschied unsichtbar, was gefährlich ist.

Die Daten selbst und die Darstellung solcher Daten sind unterschiedlich und sollten nicht verwechselt werden. Zeichenfolgen sind (konzeptionell) eine Folge von Codepunkten, werden jedoch als Bytearray im Speicher dargestellt und als eine Bytefolge dargestellt, wenn encode d. Wenn Sie Binärdaten in einer Zeichenfolge speichern möchten, interpretieren Sie die Nummer eines Codepunkts als Bytewert neu und beschränken Sie sich auf Codepunkte in 0-255.

(ZB eine Datei hat keine Kodierung. Die Information in dieser Datei hat eine Kodierung (sei es ASCII, UTF-16 oder EBCDIC auf Zeichenebene und Perl, HTML oder .ini auf Anwendungsebene))

Das genaue Speicherformat einer Zeichenfolge ist irrelevant, aber Sie können vollständige Ganzzahlen in einer solchen Zeichenfolge speichern:

%Vor%

Das interne Format wird entsprechend angepasst, um solche Werte zu berücksichtigen; Normale Strings belegen nicht eine ganze Zahl pro Zeichen.

    
amon 02.03.2013 06:20
quelle
2

Perls internes String-Format ist implementierungsabhängig, aber normalerweise ein Super-Set von UtF-8. Es spielt keine Rolle, was es ist, weil Sie dekodieren und kodieren, um Strings in das interne Format und von diesem in andere Kodierungen zu konvertieren.

Dekodieren konvertiert in perls internes Format, encodiert Konvertierungen aus Perls internem Format.

Binärdaten werden intern genauso wie die Zeichen 0 bis 255 gespeichert.

Kodieren und dekodieren Sie einfach zwischen den Formaten. Beispielsweise UTF-8-Codierung bedeutet, dass nur jedes Zeichen 0 bis 255 unter Verwendung von einem Oktett perl Zeichen vlaues sein wird, das heißt, dass die Kette von UTF8 Oktetten besteht.

    
Myforwik 02.03.2013 06:03
quelle
-2

Perl kann mehr als Unicode verarbeiten, daher ist es sehr flexibel. Manchmal möchten Sie sich mit etwas verbinden, was nicht möglich ist. Sie können diese Transformationen also verschlüsseln (...) und dekodieren (...). siehe Ссылка

    
Andrew Stollak 02.03.2013 05:15
quelle

Tags und Links