Нельзя кодировать символ Unicode u'\u2019'
(правая одинарная кавычка U + 2019) в ASCII, поскольку в ASCII этот символ отсутствует. ASCII - это только основной латинский алфавит, цифры и знаки препинания; у вас нет акцентированных букв или «умных цитат», подобных этому персонажу.
Так что вам придется выбрать другую кодировку. Теперь обычно разумно было бы экспортировать в UTF-8, который может содержать любой символ Unicode. К сожалению для вас, если ваши целевые пользователи используют Office (и они, вероятно, используют), они не смогут читать символы в кодировке UTF-8 в CSV. Вместо этого Excel будет читать файлы, используя системную кодовую страницу по умолчанию для этого компьютера (также вводящую в заблуждение как кодовую страницу «ANSI»), и в итоге получит моджибаке, например ’
вместо ’
.
Это означает, что вам нужно угадать системную кодовую страницу по умолчанию, если вы хотите, чтобы символы правильно отображались. Для западных пользователей это будет кодовая страница 1252. Пользователи с незападными установками Windows увидят неправильные символы, но с этим ничего не поделаешь (кроме как организовать кампанию по написанию писем в Microsoft, чтобы просто отбросить глупую чепуху с ANSI уже и использовать UTF-8, как и все).
Кодовая страница 1252 может содержать U + 2019 (’
), но, очевидно, есть еще много символов, которые она не может представлять. Чтобы избежать получения UnicodeEncodeError
для этих символов, вы можете использовать аргумент ignore
(или replace
, чтобы заменить их знаками вопроса).
dmessage= contact.message.encode('cp1252', 'ignore')
в качестве альтернативы, чтобы отказаться от всех не-ASCII символов, чтобы каждый получил одинаково плохой опыт независимо от локали:
dmessage= contact.message.encode('ascii', 'ignore')