Tylko dlatego, że ciąg twierdzi, że jest UTF-8, nie oznacza, że jest to UTF-8. \xe9
to é
w ISO-8859-1
(AKA Latin-1), ale jest nieprawidłowy w UTF-8; podobnie, \xf1
to ñ
w ISO-8859-1, ale nieprawidłowe w UTF-8. Sugeruje to, że ciąg jest w rzeczywistości zakodowany w ISO-8859-1, a nie UTF-8. Możesz to naprawić za pomocą kombinacji force_encoding
aby poprawić zamieszanie Rubiego dotyczące bieżącego kodowania i kodowania
aby ponownie zakodować go jako 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"
Więc przed wysłaniem tego ciągu do bazy danych chcesz:
name = name.force_encoding('iso-8859-1').encode('utf-8')
Niestety nie ma sposobu, aby wiarygodnie wykryć rzeczywiste kodowanie ciągu. Różne kodowania nakładają się na siebie i nie ma sposobu, aby stwierdzić, czy è
(\xe8
w ISO-8859-1) lub č
(\xe8
w ISO-8859-2) jest właściwą postacią bez ręcznego sprawdzania poprawności.