он работал для меня на 000webhost, выполнив следующие действия:
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1" . "\r\n";
$headers .= "From: ". $from. "\r\n";
$headers .= "Reply-To: ". $from. "\r\n";
$headers .= "X-Mailer: PHP/" . phpversion();
$headers .= "X-Priority: 1" . "\r\n";
Введите адрес электронной почты при отправке электронной почты
mail('email@gmail.com', $subject, $message, $headers)
Используйте ''
, а не ""
Этот код работает, но письмо было получено с задержкой в полчаса
Вам нужно прочитать Python Unicode HOWTO . Эта ошибка является самым первым примером .
В принципе, прекратите использование str
для преобразования из Юникода в кодированный текст / байты.
Вместо этого правильно используйте .encode()
для кодирования строки:
p.agent_info = u' '.join((agent_contact, agent_telno)).encode('utf-8').strip()
или полностью работать в юникоде.
Это классическая точка болида unicode python! Рассмотрим следующее:
a = u'bats\u00E0'
print a
=> batsà
Все хорошо до сих пор, но если мы назовем str (a), посмотрим, что получится:
str(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)
О, падайте, это не собирается любой хороший! Чтобы исправить ошибку, явным образом закодируйте байты с помощью .encode и скажите python, какой кодек использовать:
a.encode('utf-8')
=> 'bats\xc3\xa0'
print a.encode('utf-8')
=> batsà
Voil \ u00E0!
Проблема в том, что при вызове str ( ), python использует кодировку символов по умолчанию, чтобы попытаться и закодировать байты, которые вы ему дали, что в вашем случае иногда представляет символы юникода. Чтобы устранить проблему, вы должны сказать python, как обращаться со строкой, которую вы даете ей, используя .encode ('whatever_unicode').
Для отличной экспозиции по этой теме см. Раздел PyCon от Ned Batchelder: http://nedbatchelder.com/text/unipain .html
Добавьте строку ниже в начале вашего скрипта (или в качестве второй строки):
# -*- coding: utf-8 -*-
Это определение кодировки исходного кода python. Дополнительная информация в PEP 263 .
Для меня работала:
BeautifulSoup(html_text,from_encoding="utf-8")
Надеюсь, это кому-то поможет.
Ниже решения работало для меня, Просто добавлено
u "String"
blockquote>(представляющее строку как unicode) перед моей строкой.
result_html = result.to_html(col_space=1, index=False, justify={'right'}) text = u""" <html> <body> <p> Hello all, <br> <br> Here's weekly summary report. Let me know if you have any questions. <br> <br> Data Summary <br> <br> <br> {0} </p> <p>Thanks,</p> <p>Data Team</p> </body></html> """.format(result_html)
ну, я все испробовал, но это не помогло, после того, как я разобрался, я понял следующее, и это помогло. используется python 2.7.
# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
Вот переименование некоторых других так называемых ответов «cop out». Бывают ситуации, когда простое отбрасывание неприятных символов / строк является хорошим решением, несмотря на протесты, озвученные здесь.
def safeStr(obj):
try: return str(obj)
except UnicodeEncodeError:
return obj.encode('ascii', 'ignore').decode('ascii')
except: return ""
Тестирование:
if __name__ == '__main__':
print safeStr( 1 )
print safeStr( "test" )
print u'98\xb0'
print safeStr( u'98\xb0' )
Результаты:
1
test
98°
98
Предложение: вместо этого вы можете назвать эту функцию toAscii
? Это вопрос предпочтения.
Я просто использовал следующее:
import unicodedata
message = unicodedata.normalize("NFKD", message)
Проверьте, что в документации говорится об этом:
unicodedata.normalize (form, unistr) Возвращает форму нормальной формы для Unistode string unistr. Допустимыми значениями для формы являются «NFC», «NFKC», «NFD» и «NFKD».
Стандарт Unicode определяет различные формы нормализации строки Unicode на основе определения канонической эквивалентности и совместимости эквивалентность. В Unicode несколько символов могут быть выражены различными способами. Например, символ U + 00C7 (LATIN CAPITAL LETTER C WITH CEDILLA) также может быть выражен как последовательность U + 0043 (LATIN CAPITAL LETTER C) U + 0327 (КОМБИНИРОВАНИЕ CEDILLA).
Для каждого символа , существуют две нормальные формы: нормальная форма C и нормальная форма D. Нормальная форма D (NFD) также известна как каноническое разложение и переводит каждый символ в его разложенную форму. Нормальная форма C (NFC) сначала применяет каноническое разложение, а затем снова складывает предварительно комбинированные символы.
В дополнение к этим двум формам существуют две дополнительные нормальные формы, основанные на эквивалентности эквивалентности. В Unicode поддерживаются определенные символы, которые обычно объединяются с другими символами. Например, U + 2160 (ROMAN NUMERAL ONE) на самом деле то же самое, что и U + 0049 (LATIN CAPITAL LETTER I). Тем не менее, он поддерживается в Unicode для совместимости с существующими наборами символов (например, gb2312).
Нормальная форма KD (NFKD) применит декомпозицию совместимости, то есть заменит все символы совместимости на их эквиваленты. Нормальная форма KC (NFKC) сначала применяет декомпозицию совместимости, за которой следует каноническая композиция.
Даже если две строки Юникода нормированы и выглядят одинаково для читателя человека, если у вас есть сочетание символов, а другое не может сравниться с равными.
blockquote>Решает его для меня. Простой и легкий.
Я нашел элегантную работу для меня, чтобы удалить символы и продолжать держать строку в виде строки следующим образом:
yourstring = yourstring.encode('ascii', 'ignore').decode('ascii')
Важно заметить, что использование опции ignore опасно, поскольку она беззвучно удаляет любой юникод (и интернационализации) от кода, который его использует, как показано здесь (конвертировать unicode):
>>> u'City: Malmö'.encode('ascii', 'ignore').decode('ascii')
'City: Malm'
yourstring = yourstring.encode('utf-8', 'ignore').decode('utf-8')
– luca76
14 February 2017 в 16:38
Мы допустили эту ошибку при запуске manage.py migrate
в Django с локализованными приборами.
Наш источник содержал объявление # -*- coding: utf-8 -*-
, MySQL была правильно настроена для utf8, а Ubuntu располагал соответствующим языковым пакетом и значениями в /etc/default/locale
.
Проблема заключалась в том, что в контейнере Django (мы используем докер) отсутствовала LANG
env var.
Установка LANG
на en_US.UTF-8
и перезапуск контейнер перед повторным запуском миграции исправил проблему.
Если у вас есть что-то вроде packet_data = "This is data"
, сделайте это на следующей строке, сразу после инициализации packet_data
:
unic = u''
packet_data = unic
Попробуйте это, возможно,
# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
Просто добавьте переменную encode ('utf-8')
agent_contact.encode('utf-8')
Проблема в том, что вы пытаетесь напечатать символ юникода, но ваш терминал не поддерживает его.
Вы можете попробовать установить пакет language-pack-en
, чтобы исправить это:
sudo apt-get install language-pack-en
, который обеспечивает обновление данных перевода на английском языке для всех поддерживаемых пакетов (включая Python). При необходимости установите другой языковой пакет (в зависимости от того, какие символы вы пытаетесь распечатать).
В некоторых дистрибутивах Linux это необходимо, чтобы убедиться, что локальные английские локали установлены правильно (так что символы Unicode может обрабатываться оболочкой / терминалом). Иногда его проще установить, чем настраивать вручную.
Затем при написании кода убедитесь, что вы используете правильную кодировку в своем коде.
Например:
open(foo, encoding='utf-8')
Если у вас все еще есть проблема, дважды проверьте конфигурацию вашей системы, например:
/etc/default/locale
), который должен иметь, например, LANG="en_US.UTF-8"
LC_ALL="en_US.UTF-8"
LANG
/ LC_CTYPE
в оболочке. locale -a | grep "UTF-8"
Демонстрация проблемы и решения в новой виртуальной машине.
vagrant
): vagrant init ubuntu/trusty64; vagrant up; vagrant ssh
Смотрите: доступные ящики Ubuntu .. ™
): $ python -c 'print(u"\u2122");'
Traceback (most recent call last):
File "<string>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 0: ordinal not in range(128)
language-pack-en
: $ sudo apt-get -y install language-pack-en
The following extra packages will be installed:
language-pack-en-base
Generating locales...
en_GB.UTF-8... /usr/sbin/locale-gen: done
Generation complete.
$ python -c 'print(u"\u2122");'
™
language-pack-en
связано с Python или этим вопросом? AFAIK, он может предоставлять языковые переводы сообщений, но не имеет никакого отношения к кодированию
– Alastair McCormack
26 December 2015 в 11:47
/etc/locale.gen
, чтобы убедиться, что их язык создан до его использования?
– Alastair McCormack
26 December 2015 в 12:04
LANG
из /etc/default/locale
(поскольку /etc/locale.gen
не существует) и побежал locale-gen
, но это не помогло. Я не уверен, что делает language-pack-en
, так как я не нашел много документации и перечисление содержания этого не очень помогает.
– kenorb
27 December 2015 в 14:07
LANG
/ LC_CTYPE
/ LC_ALL
(например, LANG=C.UTF-8
).
– jfs
1 January 2016 в 04:10
Тонкая проблема, вызывающая потерю печати даже при неправильной настройке переменных среды, например. здесь LC_ALL установлен на «C». В Debian они препятствуют установке: Debian wiki в Locale
$ echo $LANG
en_US.utf8
$ echo $LC_ALL
C
$ python -c "print (u'voil\u00e0')"
Traceback (most recent call last):
File "<string>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)
$ export LC_ALL='en_US.utf8'
$ python -c "print (u'voil\u00e0')"
voilà
$ unset LC_ALL
$ python -c "print (u'voil\u00e0')"
voilà
env|grep -E '(LC|LANG)'
.
– Dmitry Verhoturov
8 August 2015 в 07:28
Простые вспомогательные функции найдены здесь здесь .
def safe_unicode(obj, *args):
""" return the unicode representation of obj """
try:
return unicode(obj, *args)
except UnicodeDecodeError:
# obj is byte string
ascii_text = str(obj).encode('string_escape')
return unicode(ascii_text)
def safe_str(obj):
""" return the byte string representation of obj """
try:
return str(obj)
except UnicodeEncodeError:
# obj is unicode
return unicode(obj).encode('unicode_escape')
backslashreplace
: u'\xa0'.encode('ascii', 'backslashreplace')
. Хотя вы должны избегать такого представления и настраивать среду для принятия символов не-ascii - это 2016!
– jfs
1 January 2016 в 04:05
У меня просто была эта проблема, и Google привел меня сюда, так что просто чтобы добавить к общим решениям здесь, это то, что сработало для меня:
# 'value' contains the problematic data
unic = u''
unic += value
value = unic
У меня была эта идея после прочтения Презентация Неда .
Я не претендую на то, чтобы полностью понять, почему это работает. Поэтому, если кто-нибудь может отредактировать этот ответ или поставить комментарий, чтобы объяснить, я буду признателен.
type
значения? до и после этого? Я думаю, что так получается, что, выполняя unic += value
, который является таким же, как unic = unic + value
, вы добавляете строку и unicode, где python затем принимает unicode для результирующего unic
, то есть более точного типа (подумайте о том, когда вы делаете это a = float(1) + int(1)
, a
становится float), а затем value = unic
указывает value
на новый объект unic
, который является unicode.
– Tom Myddeltyn
24 May 2016 в 21:16
Я всегда ставил код ниже в первых двух строках файлов python:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
Я действительно обнаружил, что в большинстве моих случаев просто удаление этих символов намного проще:
s = mystring.decode('ascii', 'ignore')
У меня была такая же проблема, и я смог изменить файл csv, поэтому я искал символ, например \xc7
в http://www.codetable.net , и заменил его на другой символ в моем файле.
Вы также можете изменить свой тип на utf8 , чтобы он возвращал меньше ошибок.
print
, мои строки utf-8 работают хорошо. Однако, когда я передаю свои программы в файл, он выбрасываетUnicodeEncodeError
. Фактически, когда выход перенаправляется (в файл или канал), я обнаружил, чтоsys.stdout.encoding
-None
! Решение проблемы.encode('utf-8')
решает проблему. – drevicko 18 December 2012 в 10:15PYTHONIOENCODING=utf-8
, а не печатайте строки Unicode и позволяйте среде устанавливать ожидаемую кодировку. – jfs 21 December 2013 в 05:51.encode()
для вызова. – Cerin 5 October 2016 в 17:59