Solo perché la stringa afferma di essere UTF-8 non significa che sia UTF-8. \xe9
è é
in ISO-8859-1
(AKA Latin-1) ma non è valido in UTF-8; allo stesso modo, \xf1
è ñ
in ISO-8859-1 ma non valido in UTF-8. Ciò suggerisce che la stringa è effettivamente codificata in ISO-8859-1 anziché in UTF-8. Puoi risolverlo con una combinazione di force_encoding
per correggere la confusione di Ruby sulla codifica corrente e encode
per ricodificarlo come 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"
Quindi prima di inviare quella stringa al database si desidera:
name = name.force_encoding('iso-8859-1').encode('utf-8')
Sfortunatamente, non c'è modo di rilevare in modo affidabile la vera codifica di una stringa. Le varie codifiche si sovrappongono e non c'è modo di sapere se č
(\xe8
in ISO-8859-1) o č
(\xe8
in ISO-8859-2) è il personaggio giusto senza il controllo manuale dell'integrità.