Nur weil die Zeichenfolge behauptet, UTF-8 zu sein, heißt das nicht, dass es UTF-8 ist. \xe9
ist é
in ISO-8859-1
(AKA Latin-1), ist aber in UTF-8 ungültig; ebenso \xf1
ist ñ
in ISO-8859-1, aber ungültig in UTF-8. Das deutet darauf hin, dass die Zeichenfolge tatsächlich in ISO-8859-1 und nicht in UTF-8 codiert ist. Sie können es mit einer Kombination aus force_encoding
um Rubys Verwirrung über die aktuelle Kodierung und kodieren
um es als UTF-8 neu zu kodieren:
> "Tweets en Ingl\xE9s y en Espa\xF1ol".force_encoding('iso-8859-1').encode('utf-8')
=> "Tweets en Inglés y en Español"
Bevor Sie also diesen String an die Datenbank senden, möchten Sie:
name = name.force_encoding('iso-8859-1').encode('utf-8')
Leider gibt es keine Möglichkeit, die tatsächliche Codierung einer Zeichenfolge zuverlässig zu erkennen. Die verschiedenen Kodierungen überschneiden sich und es gibt keine Möglichkeit zu sagen, ob è
(\xe8
in ISO-8859-1) oder č
(\xe8
in ISO-8859-2) ist das richtige Zeichen ohne manuelle Plausibilitätsprüfung.