Rails - сохранение почтового вложения в базе данных Postgres, приводит к PGError: ERROR: неверная последовательность байтов для кодировки "UTF8": 0xa0 - PullRequest
0 голосов
/ 12 декабря 2010

Кто-нибудь видел эту ошибку раньше?

PGError: ОШИБКА: неверная последовательность байтов для кодировки "UTF8": 0xa0

Я пытаюсь сохранить входящуюпочтовые вложения любого типа в базу данных для обработки.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 12 декабря 2010

В какой тип столбца вы сохраняете свои данные? Если вложение может быть любого типа, вам необходим столбец bytea , чтобы данные просто передавались в виде большого двоичного объекта (двоичного «большого» объекта). Как упоминалось в других ответах, эта ошибка указывает на то, что некоторые данные, отправленные в PostgreSQL, которые были помечены как текстовые в кодировке UTF-8, были неверными.

Я бы рекомендовал хранить вложения в виде двоичных файлов вместе с заголовком MIME-типа. Заголовок Content-Type должен включать кодировку символов, необходимую для преобразования двоичного содержимого в текст для вложений, где это имеет смысл: например, "text / plain; charset = iso-8859-1".

Если вы хотите, чтобы декодированный текст был доступен в базе данных, вы можете сделать так, чтобы приложение расшифровывало его и сохраняло текстовое содержимое, возможно, имея дополнительный столбец для декодированной версии. Это полезно, например, если вы хотите использовать полнотекстовую индексацию PostgreSQL для вложений электронной почты. Однако, если вы просто хотите сохранить их в базе данных для последующего извлечения как есть, просто сохраните их как двоичные файлы и не беспокойтесь о кодировке текста для приложения.

0 голосов
/ 12 декабря 2010

Я не знаю о Rails, но когда PG выдает это сообщение об ошибке, это означает, что:

  • соединение между postgres и вашим Rails-клиентом правильно настроено для использования кодировки utf-8, что означает, что все текстовые данные, проходящие между клиентом и postgres, должны быть зашифрованы в utf-8

  • и ваш Rails-клиент ошибочно отправил некоторые данные, закодированные в другой кодировке (скорее всего, latin-1 или ISO-8859): поэтому postgres отклоняет их

Вы должны заглянуть в свой клиентский код, где данные вставляются в базу данных, возможно, вы пытаетесь вставить строку не в кодировке Unicode, или имеет место неправильное транскодирование.

0 голосов
/ 12 декабря 2010

0xa0 - это неразрывный пробел, возможно, кодировка latin1.В Python я бы использовал str.decode () и str.encode (), чтобы изменить его текущую кодировку на целевую кодировку, здесь - utf8.Но я не знаю, как вы поступите с этим в Rails.

...