Die Programmiersprache Ruby (German Edition)
nach Möglichkeit den Iterator
each_char
statt wiederholter Aufrufe des Operators
[]
. Allerdings ist es in der Regel nicht erforderlich, sich viele Gedanken darüber zu machen. Ruby-Implementierungen optimieren die Fälle, die optimiert werden können, und wenn ein String ausschließlich aus 1-Byte-Zeichen besteht, ist der beliebige Zugriff auf diese Zeichen effizient. Wenn Sie eigene Optimierungen anstreben, können Sie die Instanzmethode
ascii_only?
verwenden, um herauszufinden, ob ein String ausschließlich aus 7-Bit-ASCII-Zeichen besteht.
Die Ruby 1.9-Klasse
String
definiert eine Methode namens
encoding
, die die Kodierung eines String zurückliefert (der Rückgabewert ist ein
Encoding
-Objekt, das weiter unten beschrieben wird):
# -*- coding: utf-8 -*-
s = "2∞2=4" # Beachten: Mehr-Byte-Multiplikationszeichen
s.encoding # =>
t = "2+2=4" # Alle Zeichen liegen in der ASCII-Untermenge von UTF-8
t.encoding # =>
Die Kodierung eines String-Literals basiert auf der Quellkodierung der Datei, in der es steht. Aber seine Kodierung ist nicht immer identisch mit der Quellkodierung. Wenn ein String-Literal ausschließlich 7-Bit-ASCII-Zeichen enthält, liefert seine Methode
encoding
ASCII zurück, selbst wenn die Quellkodierung beispielsweise UTF-8 ist (eine Obermenge von ASCII). Diese Optimierung teilt String-Methoden mit, dass alle Zeichen ein Byte lang sind. Und wenn ein String-Literal
\u
-Escapes enthält, dann ist seine Kodierung UTF-8, auch wenn die Quellkodierung davon abweicht.
----
ASCII- und BINARY-Kodierungen
Die weiter oben gezeigte »ASCII-8BIT«-Kodierung ist der Ruby-1.9-Name für die veraltete, von Ruby 1.8 verwendete Kodierung; es handelt sich um den ASCII-Zeichensatz ohne Einschränkungen für den Einsatz von Nicht-Druck- und Steuerzeichen. In dieser Kodierung entspricht ein Byte stets einem Zeichen, und Strings können Binär- oder Zeichendaten enthalten.
Bestimmte Ruby-1.9-Methoden erfordern, dass Sie einen Kodierungsnamen (oder ein
Encoding
-Objekt, siehe unten) angeben. Sie können diese ASCII-Kodierung als »ASCII-8BIT« oder mit ihrem Alias »BINARY« angeben. Das mag überraschen, ist aber so: Aus Rubys Sicht ist eine Sequenz von Bytes ohne Kodierung (»BINARY«) dasselbe wie eine Sequenz von 8-Bit-ASCII-Zeichen. Da die Kodierung »BINARY« eigentlich für »unkodierte Bytes« steht, können Sie diese Kodierung auch angeben, indem Sie
nil
statt eines Kodierungsnamens oder eines
Encoding
-Objekts übergeben.
Ruby 1.9 unterstützt auch eine Kodierung namens »US-ASCII«, die echtes 7-Bit-ASCII enthält; sie unterscheidet sich dahingehend von ASCII-8BIT, dass sie keine Bytes erlaubt, in denen das achte Bit gesetzt ist.
----
Bestimmte String-Operationen wie Verkettung und Mustererkennung erfordern kompatible Kodierungen zweier Strings (beziehungsweise zwischen einem String und einem regulären Ausdruck). Wenn Sie beispielsweise einen ASCII-String mit einem UTF-8-String verketten, dann erhalten Sie einen UTF-8-String. Es ist jedoch nicht möglich, einen UTF-8-String mit einem SJIS-String zu verketten: Die Kodierungen sind nicht kompatibel, und eine Ausnahme wird ausgelöst. Sie können prüfen, ob zwei Strings (beziehungsweise ein String und ein regulärer Ausdruck) kompatible Kodierungen aufweisen, indem Sie die Klassenmethode
Encoding.compatible?
verwenden. Wenn die Kodierungen der beiden Argumente kompatibel sind, gibt sie diejenige Kodierung zurück, die die Obermenge der anderen bildet. Sollten die Kodierungen inkompatibel sein, wird
nil
zurückgegeben.
Sie können die Kodierung eines Strings explizit mit
force_encoding
setzen. Das ist nützlich, wenn Sie einen String von Bytes haben (zum Beispiel aus einem I/O-Datenstrom lesen) und Ruby mitteilen möchten, wie sie als Zeichen interpretiert werden sollen. Oder wenn Sie einen String aus Mehr-Byte-Zeichen haben, jedoch einzelne Bytes mit
[]
indexieren möchten:
text = stream.readline.force_encoding("utf-8")
bytes = text.dup.force_encoding(nil) # Kodierung nil bedeutet binär
Die Methode
force_encoding
erzeugt keine Kopie ihres Empfängerobjekts; sie modifiziert die Kodierung des String und gibt diesen zurück. Diese Methode führt keine Zeichenkonvertierung durch – die zugrunde liegenden Bytes des String werden nicht geändert, sondern nur die Art und Weise, wie Ruby diese interpretiert. Wie oben gezeigt, kann das Argument von
force_encoding
der Name einer Kodierung sein, oder
nil
, um binäre
Weitere Kostenlose Bücher