Só porque a string afirma ser UTF-8 não significa que seja UTF-8.
\xe9
é é
em ISO-8859-1
(AKA Latin-1) mas é inválido em UTF-8; da mesma forma, \xf1
é ñ
em ISO-8859-1, mas inválido em UTF-8. Isso sugere que a string está realmente codificada em ISO-8859-1 em vez de UTF-8. Você pode corrigi-lo com uma combinação de force_encoding
para corrigir a confusão do Ruby sobre a codificação atual e encode
para recodificá-lo como 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"
Portanto, antes de enviar essa string para o banco de dados, você deseja:
name = name.force_encoding('iso-8859-1').encode('utf-8')
Infelizmente, não há como detectar com segurança a codificação real de uma string. As várias codificações se sobrepõem e não há como saber se
è
(\xe8
em ISO-8859-1) ou č
(\xe8
na ISO-8859-2) é o caractere certo sem verificação manual de sanidade.