as3:~/ngokevin-site# nano content/blog/20140114_test-chinese.mkd
as3:~/ngokevin-site# wok
Traceback (most recent call last):
File "/usr/local/bin/wok", line 4, in
Engine()
File "/usr/local/lib/python2.7/site-packages/wok/engine.py", line 104, in init
self.load_pages()
File "/usr/local/lib/python2.7/site-packages/wok/engine.py", line 238, in load_pages
p = Page.from_file(os.path.join(root, f), self.options, self, renderer)
File "/usr/local/lib/python2.7/site-packages/wok/page.py", line 111, in from_file
page.meta['content'] = page.renderer.render(page.original)
File "/usr/local/lib/python2.7/site-packages/wok/renderers.py", line 46, in render
return markdown(plain, Markdown.plugins)
File "/usr/local/lib/python2.7/site-packages/markdown/init.py", line 419, in markdown
return md.convert(text)
File "/usr/local/lib/python2.7/site-packages/markdown/init.py", line 281, in convert
source = unicode(source)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 1: ordinal not in range(128). -- Note: Markdown only accepts unicode input!
Как это исправить?
В некоторых других приложениях для статических блогов, основанных на python, китайский пост может быть успешно опубликован. Например, в этом приложении: http://github.com/vrypan/bucket3. На моем сайте http://bc3.brite.biz/ сообщения на китайском языке могут быть опубликованы успешно.
Не видя источника, он'ы трудно понять причину, поэтому я'придется говорить вообще.
UnicodeDecodeError: 'в формате ASCII' кодек может'т декодировать байт обычно происходит, когда вы пытаетесь преобразовать в Python 2.ул. х``, который содержит не-ASCII в строку Unicode без указания кодировки исходной строки. Короче говоря, строки в Юникоде-это совершенно отдельный тип строка Python, который не содержит каких-либо кодирования. Они только держат в Юникоде **коды точки** и, следовательно, может содержать любую точку Юникода по всему спектру. Строки содержат закодированный текст, Бейт кодировке UTF-8, UTF-16, в стандарте ISO-8895-1, ГБК, Биг5 и т. д. **Строки расшифровываются в Unicode** и **Юникоды кодируются в строки**. Файлы и текстовые данные всегда передаются в закодированной строки. Уценки авторов модуля, возможно использование в Unicode()
(где исключение) как качество ворот для остального кода - это преобразование ASCII или повторно обернуть существующие строки Юникоды на новую строку в Юникоде. Авторы уценки может'т знаю, кодировку входящего строки, поэтому будем полагаться на декодирование строк для строк в Юникоде до уценки.
Строки Юникода могут быть объявлены в коде, используя префикс U
для строк. Е. Г.
>>> my_u = u'my ünicôdé strįng'
>>> type(my_u)
<type 'unicode'>
Строки в юникоде может также прийти из файла, базы данных и сетевые модули. Когда это происходит, вы не'т нужно беспокоиться о кодировке.
Преобразование из стр
в Unicode может произойти, даже если вы Дон'т явно вызывать в Unicode(). Следующие сценарии, потому что UnicodeDecodeError
исключения:
# Explicit conversion without encoding
unicode('€')
# New style format string into Unicode string
# Python will try to convert value string to Unicode first
u"The currency is: {}".format('€')
# Old style format string into Unicode string
# Python will try to convert value string to Unicode first
u'The currency is: %s' % '€'
# Append string to Unicode
# Python will try to convert string to Unicode first
u'The currency is: ' + '€'
На следующей диаграмме вы можете увидеть, как слово в Café
был закодирован в любом "в кодировке UTF-8" или "Cp1252 на" кодирования в зависимости от типа терминала. В обоих примерах кафе
- это просто обычные символы ASCII. В UTF-8, é
кодируется с помощью двух байтов. В "Cp1252-то", é - это 0xE9 (что тоже случается, значение точки в Юникоде (это'ы не случайно)). Правильный декодировать()
вызывается и преобразование в Юникод в Python является успешным:
В этой схеме декодировать()
вызывается в кодировке ASCII
(который является тем же самым как вызовом в Unicode () без кодировке). Как ASCII может'т содержать байта больше, чем 0x7F, а этот бросит UnicodeDecodeError
исключение:
Это's хорошая практика, чтобы сформировать бутерброд Юникод в коде, где вы расшифровать все входящие данные в Юникод, работа с Юникоды, затем закодировать ул. `по пути к выходу. Это избавит вас от беспокойства по поводу кодирования строк в середине кода.
Если вам нужно испечь не-ASCII в свой исходный код, просто создайте строки в Юникоде, добавив строку с буквой "U". Е. Г.
u'Zürich'
Чтобы позволить Python, чтобы расшифровать исходный код, вам необходимо добавить заголовок кодировка соответствует фактической кодировки файла. Например, если ваш файл был закодирован 'кодировка UTF-8', вы должны использовать:
# encoding: utf-8
Это необходимо только тогда, когда у вас есть не-ASCII в исходный код.
Файлы # # # # # #
Обычно не-ASCII данные, полученные из файла. Модуля Ио
предоставляет TextWrapper, который декодирует файл "на лету", используя данный кодирование
. Вы должны использовать правильную кодировку для файла - это может'т быть легко угадывается. Например, для файла UTF-8:
import io
with io.open("my_utf8_file.txt", "r", encoding="utf-8") as my_file:
my_unicode_string = my_file.read()
my_unicode_string
тогда будут пригодны для передачи в уценке. Если UnicodeDecodeErrorс
читать (линия), затем вы'ве, вероятно, использовал неправильное значение кодировки.
Модуль Python 2.7 CSV не поддерживает не-ASCII символы 😩. Помощь под рукой, однако, с https://pypi.python.org/pypi/backports.csv. Используйте его, как и выше, но передавать открытого файла к ней:
from backports import csv
import io
with io.open("my_utf8_file.txt", "r", encoding="utf-8") as my_file:
for row in csv.reader(my_file):
yield row
Большинство драйверов баз данных Python может возвращать данные в Unicode, но обычно требуют минимальной настройки. Всегда используйте Юникод-строк для SQL-запросов.
В строке подключения добавить:
charset='utf8',
use_unicode=True
Е. Г.
>>> db = MySQLdb.connect(host="localhost", user='root', passwd='passwd', db='sandbox', use_unicode=True, charset="utf8")
Добавить:
psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY)
Веб-страницы могут быть закодированы в любой кодировке. Заголовок тип содержимого
должен содержать поле кодировка
, чтобы намекнуть на кодирование. Контент затем можно расшифровать вручную с этим значением. Кроме того, [в Python-запросы][4] возвращает Юникоды в ответ.текст`.
Если вы должны расшифровать строки вручную, вы можете просто сделать my_string.декодирование(кодирование)
, где кодировка
является надлежащим кодирования. В Python 2.поддерживаемые кодеки х приведены здесь: [стандартных кодировок][5]. Опять же, если вы UnicodeDecodeError тогда вы'вэ наверное неправильная кодировка.
Работа с Юникоды, как вы бы нормальные СПО. Вывод # # # #
"печать" пишет через поток stdout. Питон пытается настроить энкодер на stdout, так что Юникоды кодируются в консоли's шифрование. Например, если в оболочке Linux'локаль-ный это
en_GB.Кодировка UTF-8, выход будет преобразовано в
кодировка UTF-8. На Windows, вы будете ограничены в разделе 8бит код. Неправильно настроенный консоли, например, поврежден язык, может привести к неожиданным ошибкам печати.
PYTHONIOENCODINGпеременная среды может заставить кодировку для вывода. Файлы # # # # # # Как ввод,
Ио.открытия могут быть использованы для прозрачного преобразования Юникоды для закодированных байтов строки.
Такую же конфигурацию для чтения позволит Юникоды быть написано напрямую.
В Python 3 не больше способен Юникод, чем в Python 2.х, однако он немного меньше в замешательстве на эту тему. Например, регулярное ул. теперь строку в Юникоде и старая ул.
сейчас байт
.
По умолчанию кодировка UTF-8, поэтому если вы.декодировать()строку байт без указания кодировки, в Python 3, использует кодировку UTF-8. Это, вероятно, фиксирует 50% людей'ов проблемы с Unicode. Далее,
открыть()работает в текстовом режиме по умолчанию, поэтому возвращает декодированные
ул` (юникодные). Кодирование является производной от языка, который стремится быть UTF-8 на ООН*х систем или 8-разрядный код страницы, такие как windows-1251, на окнах ящики.
[4]: http://docs.python-requests.org/en/master/ "в языке Python-запросы" и [5]: https://docs.python.org/2/library/codecs.html#standard-encodings на "стандартных кодировок и"
Это'ы поганых рубить (там'Почему вы должны использовать перезагрузить
), которые будут только маскировать проблемы и препятствовать миграции на Python 3.х. Понять проблему, устранить причину и наслаждаться Юникод Дзен.
См https://stackoverflow.com/questions/3828723/why-should-we-not-use-sys-setdefaultencodingutf-8-in-a-py-script/34378962#34378962 для получения дополнительной информации
Конечно, я понял:
as3:/usr/local/lib/python2.7/site-packages# cat sitecustomize.py
# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
Дайте мне проверить:
as3:~/ngokevin-site# python
Python 2.7.6 (default, Dec 6 2013, 14:49:02)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.getdefaultencoding()
'utf8'
>>>
Выше показано, что кодировка по умолчанию в python - utf8
. Тогда ошибка больше не возникает.
Это классическая "проблема юникода". Я считаю, что объяснение этого вопроса выходит за рамки ответа на StackOverflow, чтобы полностью объяснить происходящее.
Это хорошо объяснено здесь.
Если очень кратко, вы передали что-то, что интерпретируется как строка байтов, чему-то, что должно декодировать ее в символы Unicode, но кодек по умолчанию (ascii) не работает.
В презентации, на которую я вам указал, содержится совет, как избежать этого. Сделайте свой код "бутербродом с юникодом". В Python 2 помогает использование from __future__ import unicode_literals
.
Обновление: как можно исправить код:
OK - в вашей переменной "source" есть несколько байт. Из вашего вопроса неясно, как они туда попали - может быть, вы считываете их из веб-формы? В любом случае, они не закодированы в ascii, но python пытается преобразовать их в юникод, полагая, что это так. Вам нужно явно указать ему кодировку. Это означает, что вы должны знать, что такое кодировка! Это не всегда легко, и это полностью зависит от того, откуда взята эта строка. Вы можете поэкспериментировать с некоторыми распространенными кодировками - например, UTF-8. Вы сообщаете unicode() кодировку в качестве второго параметра:
source = unicode(source, 'utf-8')
В некоторых случаях, когда вы проверяете кодировку по умолчанию (print sys.getdefaultencoding()
), возвращается, что вы используете ASCII. Если изменить на UTF-8, то это не работает, в зависимости от содержимого вашей переменной.
Я нашел другой способ:
import sys
reload(sys)
sys.setdefaultencoding('Cp1252')
Я искал, чтобы решить следующее сообщение об ошибке:
unicodedecodeerror: 'в формате ASCII' кодек может'т декодировать байт 0xe2 в положении 5454: порядковый номер не в диапазон(128)
Я, наконец, получил ее исправить путем указания 'кодирования':
f = open('../glove/glove.6B.100d.txt', encoding="utf-8")
Жаль, что это может помочь вам тоже.
"UnicodeDecodeError: 'ascii' codec can't decode byte"
Причиной этой ошибки: input_string должны быть в юникоде, но г. дали
"TypeError: Decoding Unicode is not supported"
Причиной этой ошибки: пытаюсь конвертировать input_string Unicode в кодировке Юникод
Так что сначала проверьте, что ваш input_string является Ул
и конвертировать в Юникод, если необходимо:
if isinstance(input_string, str):
input_string = unicode(input_string, 'utf-8')
Во-вторых, выше просто меняет тип, но не удалить не символы ASCII. Если вы хотите удалить не-ASCII символы:
if isinstance(input_string, str):
input_string = input_string.decode('ascii', 'ignore').encode('ascii') #note: this removes the character and encodes back to string.
elif isinstance(input_string, unicode):
input_string = input_string.encode('ascii', 'ignore')
Я считаю, что лучший-это всегда преобразования в Юникод - но этого трудно добиться, потому что на практике вы'd должны проверить и преобразовать аргументы, чтобы каждая функция и способ вы когда-нибудь напишите что включает в себя некоторые формы обработки строки.
Поэтому я придумал следующий подход к либо гарантия юникоды или байтовых строк, либо ввод. Короче говоря, использовать следующего лямбда-выражения:
# guarantee unicode string
_u = lambda t: t.decode('UTF-8', 'replace') if isinstance(t, str) else t
_uu = lambda *tt: tuple(_u(t) for t in tt)
# guarantee byte string in UTF8 encoding
_u8 = lambda t: t.encode('UTF-8', 'replace') if isinstance(t, unicode) else t
_uu8 = lambda *tt: tuple(_u8(t) for t in tt)
Примеры:
text='Some string with codes > 127, like Zürich'
utext=u'Some string with codes > 127, like Zürich'
print "==> with _u, _uu"
print _u(text), type(_u(text))
print _u(utext), type(_u(utext))
print _uu(text, utext), type(_uu(text, utext))
print "==> with u8, uu8"
print _u8(text), type(_u8(text))
print _u8(utext), type(_u8(utext))
print _uu8(text, utext), type(_uu8(text, utext))
# with % formatting, always use _u() and _uu()
print "Some unknown input %s" % _u(text)
print "Multiple inputs %s, %s" % _uu(text, text)
# but with string.format be sure to always work with unicode strings
print u"Also works with formats: {}".format(_u(text))
print u"Also works with formats: {},{}".format(*_uu(text, text))
# ... or use _u8 and _uu8, because string.format expects byte strings
print "Also works with formats: {}".format(_u8(text))
print "Also works with formats: {},{}".format(*_uu8(text, text))
Здесь's некоторые более рассуждение об этом.
Кодирование преобразует объект Юникод в объект String. Я думаю, что вы пытаетесь кодировать объект String. сначала преобразовать в объект Unicode и потом кодировать, что объект Unicode в 'кодировка UTF-8'. например
result = yourFunction()
result.decode().encode('utf-8')
Чтобы решить эту проблему на уровне операционной системы в Установка Ubuntu проверить следующее: `раковину $ язык набора символов ``
Если вы получаете
языка: не удается установить lc_ctype для локали по умолчанию: нет такого файла или каталога
вместо
В UTF-8
затем установите языкового
и значение lc_all
такой:
`раковину
значение lc_all экспорт=с"$; язык.В UTF-8"и
экспорт языкового=то"$; язык.В UTF-8"и
``
У меня была такая же проблема, но это не't работа для Python 3. Я следил за этим, и это решило мою проблему:
enc = sys.getdefaultencoding()
file = open(menu, "r", encoding = enc)
Вы должны задать кодировку при чтении/записи файла.
Получил такую же ошибку, и это решило мою ошибку. Спасибо! Python 2 и Python 3 различия в обработке Юникода делает маринованные, совсем несовместимых файлов для загрузки. Поэтому использовать Python рассольник'аргумент s кодирования. Ссылке ниже помог мне решить подобную проблему, когда я пытаюсь открыть маринованные данных из моего питона 3.7, В то время как мой файл был изначально сохранен в Python 2.X версии. https://blog.modest-destiny.com/posts/python-2-and-3-compatible-pickle-save-and-load/ Я копирую функцию load_pickle в мой скрипт и назвал load_pickle(pickle_file) во время загрузки мой input_data такой:
input_data = load_pickle("my_dataset.pkl")
Функция load_pickle-это здесь:
def load_pickle(pickle_file):
try:
with open(pickle_file, 'rb') as f:
pickle_data = pickle.load(f)
except UnicodeDecodeError as e:
with open(pickle_file, 'rb') as f:
pickle_data = pickle.load(f, encoding='latin1')
except Exception as e:
print('Unable to load data ', pickle_file, ':', e)
raise
return pickle_data
Короче, для обеспечения надлежащей обработки юникода в Python 2:
Для объяснения, см. @Аластер Маккормак'ы развернутый ответ.
У меня такая же проблема со строкой "и PastelerÃна Майорке" и я решил с:
unicode("PastelerÃa Mallorca", 'latin-1')
У меня была такая же ошибка, с URL-адреса, содержащие не-ASCII символы (байты со значениями > 128), мое решение:
url = url.decode('utf8').encode('utf-8')
Внимание: UTF-8, кодировке utf8 являются псевдонимами . Используя только 'в формате utf8' или 'кодировка UTF-8' должно работать таким же образом
В моем случае, работал для меня в Python 2.7, я полагаю, это назначение изменило 'что-то' в ул
внутреннее представление, т. е. его силами право декодирование сохраненных байт последовательности в URL
и, наконец, добавляет строку в поддержка UTF-8 стр
с магией в нужном месте.
Unicode в Python-это черная магия для меня.
Надеюсь, пригодится
Эта ошибка возникает, когда есть некоторые не символы ASCII в нашей строке и мы выполняем любые операции на этой строке, без должной расшифровки. Это помогло мне решить мою проблему. Я читаю CSV-файл со столбцами код,текст и декодирования символов, как показано ниже:
train_df = pd.read_csv("Example.csv")
train_data = train_df.values
for i in train_data:
print("ID :" + i[0])
text = i[1].decode("utf-8",errors="ignore").strip().lower()
print("Text: " + text)
В Джанго (1.9.10) проекта/питон 2.7.5 у меня частые UnicodeDecodeError
исключения, в основном когда я пытаюсь кормить Юникод для лесозаготовки. Я сделал вспомогательную функцию для произвольных объектов, в основном формата в 8-битный ASCII строки и заменять любые символы, не входящие в таблицу '?'. Я думаю, что это's не лучшее решение, но с кодировкой по умолчанию является код ASCII (и я Дон'т хотим, чтобы изменить его) он будет делать:
в <предварительно> деф encode_for_logging(с, кодировка='в формате ASCII'): если isinstance(с, basestring): вернуться В. кодирование(кодировка, 'замену') Элиф isinstance(с, повторяемое): когда = [] для V в C: была.добавить(encode_for_logging(в кодировке)) вернуться была другое: возвращение encode_for_logging(Юникод(с)) </пред>`
Указать: # кодировка= кодировка UTF-8 в верхней части файла Python, это должно исправить проблему
Вот мое решение, просто добавьте кодировки. с открыть(файл - > кодировка='в формате utf8') как F`
И потому что чтение файла перчатка займет много времени, рекомендую к файлу перчатки с файлом и NumPy. Когда в следующий раз Вы читаете встраивания Весов, это позволит сэкономить ваше время.
import numpy as np
from tqdm import tqdm
def load_glove(file):
"""Loads GloVe vectors in numpy array.
Args:
file (str): a path to a glove file.
Return:
dict: a dict of numpy arrays.
"""
embeddings_index = {}
with open(file, encoding='utf8') as f:
for i, line in tqdm(enumerate(f)):
values = line.split()
word = ''.join(values[:-300])
coefs = np.asarray(values[-300:], dtype='float32')
embeddings_index[word] = coefs
return embeddings_index
# EMBEDDING_PATH = '../embedding_weights/glove.840B.300d.txt'
EMBEDDING_PATH = 'glove.840B.300d.txt'
embeddings = load_glove(EMBEDDING_PATH)
np.save('glove_embeddings.npy', embeddings)
Ссылка Гист: https://gist.github.com/BrambleXu/634a844cdd3cd04bb2e3ba3c83aef227