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.