Bare fordi strengen hævder at være UTF-8, betyder det ikke, at den er UTF-8. \xe9
er é
i ISO-8859-1
(AKA Latin-1), men den er ugyldig i UTF-8; på samme måde \xf1
er ñ
i ISO-8859-1, men ugyldig i UTF-8. Det tyder på, at strengen faktisk er kodet i ISO-8859-1 i stedet for UTF-8. Du kan rette det med en kombination af force_encoding
for at rette op på Rubys forvirring om den aktuelle kodning og kodning
for at omkode det som 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"
Så før du sender den streng til databasen, vil du:
name = name.force_encoding('iso-8859-1').encode('utf-8')
Desværre er der ingen måde at detektere en strengs rigtige kodning på. De forskellige kodninger overlapper hinanden, og der er ingen måde at sige om è
(\xe8
i ISO-8859-1) eller č
(\xe8
i ISO-8859-2) er det rigtige tegn uden manuel fornuftskontrol.