Hanya karena string mengklaim sebagai UTF-8 tidak berarti bahwa itu adalah UTF-8. \xe9
adalah é
di ISO-8859-1
(AKA Latin-1) tetapi tidak valid dalam UTF-8; sama, \xf1
adalah ñ
di ISO-8859-1 tetapi tidak valid di UTF-8. Itu menunjukkan bahwa string sebenarnya dikodekan dalam ISO-8859-1 daripada UTF-8. Anda dapat memperbaikinya dengan kombinasi force_encoding
untuk mengoreksi kebingungan Ruby tentang penyandian saat ini dan encode
untuk menyandikan ulang sebagai 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"
Jadi sebelum mengirim string itu ke database, Anda ingin:
name = name.force_encoding('iso-8859-1').encode('utf-8')
Sayangnya, tidak ada cara untuk mendeteksi penyandian string yang sebenarnya dengan andal. Berbagai penyandian tumpang tindih dan tidak ada cara untuk mengetahui apakah è
(\xe8
dalam ISO-8859-1) atau č
(\xe8
dalam ISO-8859-2) adalah karakter yang tepat tanpa pemeriksaan kewarasan manual.