Само защото низът твърди, че е UTF-8, не означава, че е UTF-8. \xe9
е é
в ISO-8859-1
(AKA Latin-1), но е невалиден в UTF-8; подобно, \xf1
е ñ
в ISO-8859-1, но невалиден в UTF-8. Това предполага, че низът всъщност е кодиран в ISO-8859-1, а не в UTF-8. Можете да го поправите с комбинация от force_encoding
за коригиране на объркването на Ruby относно текущото кодиране и encodeкод>
за да го прекодирате като 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"
Така че, преди да изпратите този низ към базата данни, искате да:
name = name.force_encoding('iso-8859-1').encode('utf-8')
За съжаление, няма начин надеждно да се открие истинското кодиране на низ. Различните кодировки се припокриват и няма начин да се разбере дали è
(\xe8
в ISO-8859-1) или č
(\xe8
в ISO-8859-2) е правилният знак без ръчна проверка за разумност.