ruby 1.9, force_encoding, aber überprüfe

Ich habe eine Zeichenfolge, die ich aus einer Eingabe gelesen habe.

Meines Wissens ist es UTF8. Okay:

<code>string.force_encoding("utf8")
</code>

Aber wenn diese Zeichenfolge Bytes enthält, die nicht für UTF8 zulässig sind, möchte ich dies jetzt wissen und Maßnahmen ergreifen.

Wird force_encoding ("utf8") normalerweise ausgelöst, wenn es auf solche Bytes stößt? ichglauben es wird nicht.

Wenn ich einen mache#kodieren Ich könnte aus den praktischen Optionen auswählen, was mit Zeichen geschehen soll, die in der Quellcodierung (oder Zielcodierung) ungültig sind.

Aber ich mache keinen #encode, ich mache eine #force_encoding. Es hat keine solchen Optionen.

Wäre es sinnvoll zu

<code>string.force_encoding("utf8").encode("utf8")
</code>

eine Ausnahme sofort bekommen? Normalerweise Kodierungvon utf8zu utf8 macht keinen sinn. Aber vielleicht ist dies der Weg, um es sofort zu erhöhen, wenn es ungültige Bytes gibt? Oder nutzen Sie die:replace option etc etwas anderes mit ungültigen bytes machen?

Aber nein, das scheint auch nicht zu funktionieren.

Weiß jemand?

<code>1.9.3-p0 :032 > a = "bad: \xc3\x28 okay".force_encoding("utf-8")
=> "bad: \xC3( okay"
1.9.3-p0 :033 > a.valid_encoding?
=> false
</code>

Okay, aber wie finde und eliminiere ich diese schlechten Bytes? Seltsamerweise löst dies NICHT aus:

<code>1.9.3-p0 :035 > a.encode("utf-8")
 => "bad: \xC3( okay"
</code>

Wenn ich auf eine andere Codierung konvertieren würde, würde es!

<code>1.9.3-p0 :039 > a.encode("ISO-8859-1")
Encoding::InvalidByteSequenceError: "\xC3" followed by "(" on UTF-8
</code>

Oder wenn ich es sagte, würde es durch ein "?" =>

<code>1.9.3-p0 :040 > a.encode("ISO-8859-1", :invalid => :replace)
=> "bad: ?( okay"
</code>

Ruby hat es also auf den Punkt gebracht, zu wissen, was in utf-8 schlechte Bytes sind, und sie durch etwas anderes zu ersetzen - bei der Konvertierung in eine andere Codierung. Ich aber nichtwollen um auf eine andere Kodierung umzustellen, möchte ich utf8 bleiben - aber ich möchte möglicherweise erhöhen, wenn sich ein ungültiges Byte darin befindet, oder ich möchte ungültige Bytes durch Ersatzzeichen ersetzen.

Gibt es nicht eine Möglichkeit, Rubin dazu zu bringen?

aktualisieren Ich glaube, dass dies Ruby in 2.1 endlich hinzugefügt wurde, wobei String # scrub in der 2.1-Vorschau-Version vorhanden ist, um dies zu tun. Also schau danach!

Antworten auf die Frage(9)

Ihre Antwort auf die Frage