Die Programmiersprache Ruby (German Edition)
Kodierung anzugeben. Sie können auch ein
Encoding
-Objekt übergeben, um die Kodierung festzulegen.
force_encoding
führt keine Validierung durch; es wird nicht geprüft, ob die zugrunde liegenden Bytes des String eine gültige Sequenz von Zeichen in der angegebenen Kodierung darstellen. Verwenden Sie
valid_encoding?
, um eine Validierung durchzuführen. Diese Instanzmethode erwartet keine Argumente und überprüft, ob die Bytes des Strings unter Verwendung der Kodierung des String als gültige Zeichensequenz interpretiert werden können:
s = "\xa4".force_encoding("utf-8") # Dies ist kein gültiger UTF-8-String
s.valid_encoding? # => false
Die Methode
encode
(und ihre Mutator-Variante
encode!
) eines String unterscheidet sich deutlich von
force_encoding
. Sie gibt einen String zurück, der dieselbe Zeichensequenz darstellt wie ihr Empfängerobjekt, verwendet aber eine andere Kodierung. Um die Kodierung eines String auf diese Weise zu ändern – sie zu transkodieren -, muss die Methode
encode
die zugrunde liegenden Bytes ändern, aus denen der String besteht.
# -*- coding: utf-8 -*-
euro1 = "\u20AC" # Mit dem Unicode-Eurozeichen beginnen
puts euro1 # Gibt "i" aus
euro1.encoding # =>
euro1.bytesize # => 3
euro2 = euro1.encode("iso-8859-15") # Nach Latin-15 transkodieren
puts euro2.inspect # Gibt "\xA4" aus
euro2.encoding # =>
euro2.bytesize # => 1
euro3 = euro2.encode("utf-8") # Zurück nach UTF-8 transkodieren
euro1 == euro3 # => true
Beachten Sie, dass Sie die Methode
encode
nicht besonders häufig benötigen werden. Am häufigsten werden Strings transkodiert, bevor sie in eine Datei geschrieben oder über eine Netzwerkverbindung gesendet werden. Und wie wir in „9.7.2 Streams und Kodierungen“ sehen werden, unterstützen Rubys I/O-Datenstrom-Klassen die automatische Transkodierung von Text bei der Ausgabe.
Wenn der String, für den Sie
encode
aufrufen, aus unkodierten Bytes besteht, müssen Sie die Kodierung angeben, aus der diese Bytes interpretiert werden sollen, bevor sie in eine andere Kodierung transkodiert werden. Erledigen Sie das, indem Sie zwei Argumente an
encode
übergeben. Das erste Argument ist die gewünschte Kodierung, das zweite die aktuelle Kodierung des Strings. Zum Beispiel
# String als iso-8859-15-Codepunkt interpretieren und nach UTF-8 transkodieren
byte = "\xA4"
char = byte.encode("utf-8", "iso-8859-15")
Das heißt, die beiden folgenden Codezeilen haben dieselbe Wirkung:
text = bytes.encode(to, from)
text = bytes.dup.force_encoding(from).encode(to)
Zeichenkodierungen unterscheiden sich nicht nur bezüglich Ihrer Zuordnung von Bytes zu Zeichen, sondern auch bezüglich des Satzes von Zeichen, die sie darstellen können. Unicode (auch als UCS oder Universal Character Set bekannt) versucht, sämtliche Zeichen zuzulassen, aber Zeichenkodierungen, die nicht auf Unicode basieren, können nur eine Untermenge von Zeichen darstellen. Es ist daher nicht möglich, alle UTF-8-Zeichen (beispielsweise) nach EUC-JP zu transkodieren; Unicode-Zeichen, die weder lateinisch noch japanisch sind, können nicht übersetzt werden.
Wenn die Methode
encode
oder
encode!
ein Zeichen findet, das sie nicht transkodieren kann, löst sie eine Ausnahme aus:
# Die iso-8859-1-Kodierung hat kein Euro-Zeichen und löst eine Ausnahme aus
"\u20AC".encode("iso-8859-1")
3.2.6.2 Die Klasse Encoding
Die Ruby 1.9-Klasse
Encoding
stellt eine Zeichenkodierung dar.
Encoding
-Objekte dienen als einfache Bezeichner für eine Kodierung und haben keine eigenen Methoden. Die Methode
name
gibt den Namen einer Kodierung zurück.
to_s
ist ein Synonym für
name
, und
inspect
konvertiert ein
Encoding
-Objekt in einen etwas ausführlicheren String als
name
.
Ruby definiert eine Konstante für jede eingebaute Kodierung, die unterstützt wird, und das ist die einfachste Möglichkeit, eine fest einprogrammierte Kodierung in Ihrem Programm anzugeben. Zu den vordefinierten Konstanten gehören mindestens folgende:
Encoding::ASCII_8BIT # Auch ::BINARY
Encoding::UTF_8 # UTF-8-kodierte Unicode-Zeichen
Encoding::EUC_JP # EUC-kodiertes Japanisch
Encoding::SHIFT_JIS # Japanisch: auch ::SJIS, ::WINDOWS_31J, ::CP932
Beachten Sie, dass dies Konstanten sind, die daher in Großbuchstaben geschrieben werden müssen, und Bindestriche in den Namen der Kodierungen müssen in Unterstriche konvertiert werden. Ruby 1.9 unterstützt auch die Kodierung US-ASCII, die europäischen Kodierungen ISO-8859-1 bis ISO-8859-15
Weitere Kostenlose Bücher