In IRB versuche ich Folgendes:
%Vor%Irgendwelche Ideen, was schief läuft?
Ich vermute, dass "\xBF"
bereits denkt, dass es in UTF-8 kodiert ist. Wenn Sie also encode
aufrufen, denkt es, dass Sie versuchen, eine UTF-8-Zeichenfolge in UTF-8 zu codieren / p>
%Vor%
\xBF
ist nicht gültig UTF-8, also ist das natürlich Unsinn. Wenn Sie jedoch die drei Argumente von encode
verwenden:
encode (dst_encoding, src_encoding [, Optionen]) → str
[...] Das zweite Formular gibt eine Kopie von
str
zurück, die vonsrc_encoding
nachdst_encoding
transcodiert wurde.
Sie können das Problem erzwingen, indem Sie encode
anweisen, zu ignorieren, was der String für seine Codierung hält, und ihn als Binärdaten behandeln:
Dabei ist s
die "\xBF"
, die von oben UTF-8 denkt.
Sie können auch force_encoding
auf s
erzwingen Es muss binär sein und dann das Zwei-Argument encode
:
Dies ist behoben, wenn Sie die Quelltextdatei mit einer expliziten Codepage lesen:
%Vor%Wenn Sie nur mit ASCII-Zeichen arbeiten, können Sie
verwenden %Vor%Aber was passiert, wenn wir denselben Ansatz mit gültigen UTF8-Zeichen verwenden, die in ascii ungültig sind
%Vor%Oh oh! Wir wollen, dass frío im Akzent bleibt. Hier ist eine Option, die die gültigen UTF8-Zeichen enthält
%Vor% Auch in Ruby 2.1 gibt es eine neue Methode namens scrub
, die dieses Problem löst