PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgres-Codierungsfehler in der Sidekiq-App

Nur weil die Zeichenfolge behauptet, UTF-8 zu sein, heißt das nicht, dass es UTF-8 ist. \xe9 ist é in ISO-8859-1 (AKA Latin-1), ist aber in UTF-8 ungültig; ebenso \xf1 ist ñ in ISO-8859-1, aber ungültig in UTF-8. Das deutet darauf hin, dass die Zeichenfolge tatsächlich in ISO-8859-1 und nicht in UTF-8 codiert ist. Sie können es mit einer Kombination aus force_encoding um Rubys Verwirrung über die aktuelle Kodierung und kodieren um es als UTF-8 neu zu kodieren:

> "Tweets en Ingl\xE9s y en Espa\xF1ol".force_encoding('iso-8859-1').encode('utf-8')
=> "Tweets en Inglés y en Español" 

Bevor Sie also diesen String an die Datenbank senden, möchten Sie:

name = name.force_encoding('iso-8859-1').encode('utf-8')

Leider gibt es keine Möglichkeit, die tatsächliche Codierung einer Zeichenfolge zuverlässig zu erkennen. Die verschiedenen Kodierungen überschneiden sich und es gibt keine Möglichkeit zu sagen, ob è (\xe8 in ISO-8859-1) oder č (\xe8 in ISO-8859-2) ist das richtige Zeichen ohne manuelle Plausibilitätsprüfung.