文字列がUTF-8であると主張しているからといって、それがUTF-8であるとは限りません。 \ xe9
é
です ISO-8859-1
(別名Latin-1)ただし、UTF-8では無効です。同様に、 \ xf1
ñ
です ISO-8859-1では無効ですが、UTF-8では無効です。これは、文字列が実際にはUTF-8ではなくISO-8859-1でエンコードされていることを示しています。 force_encoding
>
現在のエンコーディングとエンコーディングに関するRubyの混乱を修正するためコード>
UTF-8として再エンコードするには:
> "Tweets en Ingl\xE9s y en Espa\xF1ol".force_encoding('iso-8859-1').encode('utf-8')
=> "Tweets en Inglés y en Español"
したがって、その文字列をデータベースに送信する前に、次のことを行います。
name = name.force_encoding('iso-8859-1').encode('utf-8')
残念ながら、文字列の実際のエンコーディングを確実に検出する方法はありません。さまざまなエンコーディングが重複しており、è
かどうかを判断する方法はありません。 ( \ xe8
ISO-8859-1)またはč
( \ xe8
ISO-8859-2)は、手動の健全性チェックなしで正しい文字です。