2009-11-19 5 views
7

Я получаю эту ошибку:Python, UnicodeDecodeError

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 4: ordinal not in range(128) 

Я попытался установить множество различных кодеков (в заголовке, как # -*- coding: utf8 -*-), или даже с помощью U «строка», но она по-прежнему появляется.

Как исправить это?

Edit: Я не знаю, фактический характер, что причиной этого, но так как это программа, которая рекурсивно просматривает папки, он должен быть найден файл со странными символами в имени

Код:

# -*- coding: utf8 -*- 


# by TerabyteST 

########################### 

# Explores given path recursively 
# and finds file which size is bigger than the set treshold 

import sys 
import os 

class Explore(): 
    def __init__(self): 
     self._filelist = [] 

    def exploreRec(self, folder, treshold): 
     print folder 
     generator = os.walk(folder + "/") 
     try: 
      content = generator.next() 
     except: 
      return 
     folders = content[1] 
     files = content[2] 
     for n in folders: 
      if "$" in n: 
       folders.remove(n) 
     for f in folders: 
      self.exploreRec(u"%s/%s"%(folder, f), treshold) 
     for f in files: 
      try: 
       rawsize = os.path.getsize(u"%s/%s"%(folder, f)) 
      except: 
       print "Error reading file %s"%u"%s/%s"%(folder, f) 
       continue 
      mbsize = rawsize/(1024 * 1024.0) 
      if mbsize >= treshold: 
       print "File %s is %d MBs!"%(u"%s/%s"%(folder, f), mbsize) 

Ошибка:

Traceback (most recent call last): 
    File "<pyshell#19>", line 1, in <module> 
    a.exploreRec("C:", 100) 
    File "D:/Python/Explorator/shitfinder.py", line 35, in exploreRec 
    print "Error reading file %s"%u"%s/%s"%(folder, f) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 4: ordinal not in range(128) 

Вот то, что показано с помощью print repr("Error reading file %s"%u"%s/%s"%(folder.decode('utf-8','ignore'), f.decode('utf-8','ignore')))

>>> a = Explore() 
>>> a.exploreRec("C:", 100) 
File C:/Program Files/Ableton/Live 8.0.4/Resources/DefaultPackages/Live8Library_v8.2.alp is 258 MBs! 
File C:/Program Files/Adobe/Reader 9.0/Setup Files/{AC76BA86-7AD7-1040-7B44-A90000000001}/Data1.cab is 114 MBs! 
File C:/Program Files/Microsoft Games/Age of Empires III/art/Art1.bar is 393 MBs! 
File C:/Program Files/Microsoft Games/Age of Empires III/art/art2.bar is 396 MBs! 
File C:/Program Files/Microsoft Games/Age of Empires III/art/art3.bar is 228 MBs! 
File C:/Program Files/Microsoft Games/Age of Empires III/Sound/Sound.bar is 273 MBs! 
File C:/ProgramData/Microsoft/Search/Data/Applications/Windows/Windows.edb is 162 MBs! 
REPR: 
u"Error reading file C:/ProgramData/Microsoft/Windows/GameExplorer/{1B4801C1-CA86-487E-8347-B26F1CCB2F75}/SupportTasks/0/Sito web di Mirror's Edge.lnk" 
END REPR: 
Error reading file C:/ProgramData/Microsoft/Windows/GameExplorer/{1B4801C1-CA86-487E-8347-B26F1CCB2F75}/SupportTasks/0/Sito web di Mirror's Edge.lnk 
REPR: 
u"Error reading file C:/ProgramData/Microsoft/Windows/GameExplorer/{1B4801C1-CA86-487E-8347-B26F1CCB2F75}/SupportTasks/1/Contenuti scaricabili di Mirror's Edge.lnk" 
END REPR: 
Error reading file C:/ProgramData/Microsoft/Windows/GameExplorer/{1B4801C1-CA86-487E-8347-B26F1CCB2F75}/SupportTasks/1/Contenuti scaricabili di Mirror's Edge.lnk 
REPR: 
u'Error reading file C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Google Talk/Supporto/Modalitiagnostica di Google Talk.lnk' 
END REPR: 
Error reading file C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Google Talk/Supporto/Modalitiagnostica di Google Talk.lnk 
REPR: 
u'Error reading file C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Microsoft SQL Server 2008/Strumenti di configurazione/Segnalazione errori e utilizzo funzionaliti SQL Server.lnk' 
END REPR: 
Error reading file C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Microsoft SQL Server 2008/Strumenti di configurazione/Segnalazione errori e utilizzo funzionaliti SQL Server.lnk 
REPR: 
u'Error reading file C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Mozilla Firefox/Mozilla Firefox (Modalitrovvisoria).lnk' 
END REPR: 
Error reading file C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Mozilla Firefox/Mozilla Firefox (Modalitrovvisoria).lnk 
REPR: 
u'Error reading file C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Mozilla Firefox 3.6 Beta 1/Mozilla Firefox 3.6 Beta 1 (Modalitrovvisoria).lnk' 
END REPR: 
Error reading file C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Mozilla Firefox 3.6 Beta 1/Mozilla Firefox 3.6 Beta 1 (Modalitrovvisoria).lnk 

Traceback (most recent call last): 
    File "<pyshell#21>", line 1, in <module> 
    a.exploreRec("C:", 100) 
    File "D:/Python/Explorator/shitfinder.py", line 30, in exploreRec 
    self.exploreRec(("%s/%s"%(folder, f)).encode("utf-8"), treshold) 
    File "D:/Python/Explorator/shitfinder.py", line 30, in exploreRec 
    self.exploreRec(("%s/%s"%(folder, f)).encode("utf-8"), treshold) 
    File "D:/Python/Explorator/shitfinder.py", line 30, in exploreRec 
    self.exploreRec(("%s/%s"%(folder, f)).encode("utf-8"), treshold) 
    File "D:/Python/Explorator/shitfinder.py", line 30, in exploreRec 
    self.exploreRec(("%s/%s"%(folder, f)).encode("utf-8"), treshold) 
    File "D:/Python/Explorator/shitfinder.py", line 30, in exploreRec 
    self.exploreRec(("%s/%s"%(folder, f)).encode("utf-8"), treshold) 
    File "D:/Python/Explorator/shitfinder.py", line 30, in exploreRec 
    self.exploreRec(("%s/%s"%(folder, f)).encode("utf-8"), treshold) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0x99 in position 78: ordinal not in range(128) 
>>> 
+3

Нет кода, нет помощи! –

+0

Полностью отслеживание также поможет. – retracile

+0

@John: Не совсем верно. Комментарий «coding: utf-8» в начале определяет, какой будет кодировать исходный файл python. –

ответ

13

Мы не можем угадать, что вы пытаетесь сделать, и то, что в вашем коде, а не то, что «установка много разных кодеки ", а также то, что предполагается вам для" строки ".

Пожалуйста, измените свой код в его исходном состоянии, чтобы он отражал как можно лучше то, что вы пытаетесь сделать, запустите его снова, а затем отредактируйте свой вопрос, чтобы предоставить (1) полное сообщение о трассировке и ошибке, которое вы получаете (2) фрагмент, охватывающий последнее утверждение в вашем скрипте, которое появляется в traceback (3), краткое описание того, что вы хотите сделать для кода (4), какую версию Python вы используете.

Edit после детали добавлены вопрос:

(0) Давайте попробуем некоторые преобразования на неисправном заявление:

Оригинал:
print "Error reading file %s"%u"%s/%s"%(folder, f)
Добавить пространства для уменьшения нечеткости:
print "Error reading file %s" % u"%s/%s" % (folder, f)
Добавить круглые скобки для указания порядка оценки:
print ("Error reading file %s" % u"%s/%s") % (folder, f)
Оценить (постоянное) выражение в скобках:
print u"Error reading file %s/%s" % (folder, f)

Это действительно то, что вы хотели? Предложение: постройте путь ONCE, используя лучший метод (см. Пункт (2) ниже).

(1) В общем случае для диагностики необходимо использовать repr(foo) или "%r" % foo. Таким образом, ваш диагностический код гораздо реже вызывает исключение (как это происходит здесь) И вы избегаете двусмысленности. Вставьте инструкцию print repr(folder), repr(f), прежде чем пытаться получить размер, повторить и отправить отчет.

(2) Не делайте пути по u"%s/%s" % (folder, filename) ... использовать os.path.join(folder, filename)

(3) Не голое excepts, проверить наличие известных проблем. Так что неизвестные проблемы не остаются неизвестными, сделать что-то вроде этого:

try: 
    some_code() 
except ReasonForBaleOutError: 
    continue 
except: 
    # something's gone wrong, so get diagnostic info 
    print repr(interesting_datum_1), repr(interesting_datum_2) 
    # ... and get traceback and error message 
    raise 

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

Дальнейшие правки после МРВ ("os.walk"), вспоминая старые легенды, и перечитывать код:

(4) os.walk() прогуливается по всему дереву; вам не нужно вызывать его рекурсивно.

(5) Если вы передаете строку unicode в os.walk(), результаты (пути, имена файлов) сообщаются как unicode. Тебе не нужны все, что у "бла". Тогда вам просто нужно выбрать, как вы показываете результаты Unicode.

(6) Удаление путей с помощью «$» в них: вы должны изменить список на месте, но ваш метод опасен. Попробуйте что-то вроде этого:

for i in xrange(len(folders), -1, -1): 
    if '$' in folders[i]: 
     del folders[i] 

(7) Обратитесь к файлам, присоединив имя папки и имя файла. Вы используете имя папки ORIGINAL; когда вы вырвите рекурсию, это не сработает; вам нужно будет использовать текущее значение content[0], указанное os.walk.

(8) Вы должны найти себя, используя что-то очень простое, как:

for folder, subfolders, filenames in os.walk(unicoded_top_folder): 

Там нет необходимости generator = os.walk(...); try: content = generator.next() и т.д., и BTW, если вы когда-нибудь нужно сделать generator.next() в будущем использовать except StopIteration вместо голой, за исключением ,

(9) Если вызывающий абонент предоставляет несуществующую папку, исключение не создается, оно просто ничего не делает. Если предоставленная папка существует, но пуста, то же самое. Если вам нужно провести различие между этими двумя сценариями, вам нужно будет провести дополнительное тестирование самостоятельно.

Ответ на этот комментарий от OP: "" "Спасибо, пожалуйста, прочитайте info repr(), показанный в первом сообщении. Я не знаю, почему это напечатало так много разных предметов, но похоже все они имеют проблемы, и общее между ними - это файлы .ink. Может быть, это проблема? Также, в последних, firefox, он печатает (Modalitrovvisoria), в то время как настоящее имя файла из Explorer содержит (Modalità provvisoria) "" "

(10) Ум, это не« .INK ».lower(), это« .LNK ».lower() ... возможно, вам нужно изменить шрифт в любом месте считывание это с.

(11) Тот факт, что имена «проблемных» имен заканчиваются на «.lnk»/может/быть чем-то связанным с os.walk() и/или Windows, делает что-то особенное с именами этих файлов.

(12) Я повторяю здесь заявление Python, который используется для производства этой продукции, с некоторыми пробелами введен:

print repr(
    "Error reading file %s" \ 
    % u"%s/%s" % (
     folder.decode('utf-8','ignore'), 
     f.decode('utf-8','ignore') 
     ) 
    ) 

кажется, что вы не читали, или не понял, или просто игнорировать, совет Я дал вам комментарий к другому ответу (и ответ ответчика): UTF-8 НЕ относится к именам файлов в файловой системе Windows.

Нас интересует именно то, к какой папке и f относится. Вы попирали все доказательства, пытаясь расшифровать его с помощью UTF-8. Вы усугубили обфускацию, используя опцию «игнорировать». Если бы вы использовали опцию «replace», вы бы увидели «(Modalit \ ufffdrovvisoria)». Опция «игнорировать» не имеет места в отладке.

В любом случае, факт, что некоторые из названий файлов имели какую-то ошибку, но появившийся НЕ потерять символы с опцией «игнорировать» (или не был искажен), является подозрительным.

Какая часть раздела "" "Вставьте заявление print repr(folder), repr(f)" "" Вы не поняли?Все, что вам нужно сделать, это что-то вроде этого:

print "Some meaningful text" # "error reading file" isn't 
print "folder:", repr(folder) 
print "f:", repr(f) 

(13) Кроме того, кажется, что вы ввели UTF-8 в других местах в коде, судя по TRACEBACK: self.exploreRec(("%s/%s"%(folder, f)).encode("utf-8"), treshold)

Я хотел бы укажите, что вы все еще не знаете, относятся ли папки и f к объектам str или объектам unicode, а два ответа предположили, что они, скорее всего, являются объектами str, поэтому зачем вводить blahbah.encode() ??

Более общий момент: попытайтесь понять, каковы ваши проблемы или проблемы, ПЕРЕД заменой скрипта. Трэшинг о попытке каждого предложения в сочетании с эффективной технологией отладки с нулевым нулевым временем - это не путь вперед.

(14) Когда вы снова запускаете свой скрипт, вам может понадобиться уменьшить объем вывода, запустив его над некоторым подмножеством C: \ ... особенно если вы приступите к моему первоначальному предложению, чтобы иметь отладочную печать Все имена файлов, а не только ошибочные (зная, как выглядят не ошибки), могут помочь в понимании проблемы).

Ответ на Bryan McLemore в "очистить" функцию:

(15) Здесь аннотированный интерактивный сеанс, который показывает, что на самом деле происходит с os.walk() и имена файлов не-ASCII:

C:\junk\terabytest>dir 
[snip] 
Directory of C:\junk\terabytest 

20/11/2009 01:28 PM <DIR>   . 
20/11/2009 01:28 PM <DIR>   .. 
20/11/2009 11:48 AM <DIR>   empty 
20/11/2009 01:26 PM    11 Hašek.txt 
20/11/2009 01:31 PM    1,419 tbyte1.py 
29/12/2007 09:33 AM     9 Ð.txt 
       3 File(s)   1,439 bytes 
[snip] 

C:\junk\terabytest>\python26\python 
Python 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] onwin32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from pprint import pprint as pp 
>>> import os 

os.walk (UNICODE_STRING) -> найденные в Юникода объекты

>>> pp(list(os.walk(ur"c:\junk\terabytest"))) 
[(u'c:\\junk\\terabytest', 
    [u'empty'], 
    [u'Ha\u0161ek.txt', u'tbyte1.py', u'\xd0.txt']), 
(u'c:\\junk\\terabytest\\empty', [], [])] 

os.walk (str_string) -> результаты в сек тр объекты

>>> pp(list(os.walk(r"c:\junk\terabytest"))) 
[('c:\\junk\\terabytest', 
    ['empty'], 
    ['Ha\x9aek.txt', 'tbyte1.py', '\xd0.txt']), 
('c:\\junk\\terabytest\\empty', [], [])] 

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

>>> u'\u0161'.encode('cp1252') 
'\x9a' 
>>> 'Ha\x9aek'.decode('cp1252') 
u'Ha\u0161ek' 

декодирования строка с UTF-8 не работает, как ожидалось

>>> 'Ha\x9aek'.decode('utf8') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\python26\lib\encodings\utf_8.py", line 16, in decode 
    return codecs.utf_8_decode(input, errors, True) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0x9a in position 2: unexpected code byte 

любого случайная строка байт может быть декодирована без ошибок с использованием latin1

>>> 'Ha\x9aek'.decode('latin1') 
u'Ha\x9aek' 

BUT U + 009A - это управляющий символ (ОДИНОЧНЫЙ ВРАЩАТЕЛЬ ХАРАКТЕРА), то есть бессмысленная тарабарщина; абсолютно ничего не делать с правильным ответом

>>> unicodedata.name(u'\u0161') 
'LATIN SMALL LETTER S WITH CARON' 
>>> 

(16) Этот пример показывает, что происходит, когда персонаж представима в наборе символов по умолчанию; что произойдет, если это не так? Вот пример (с использованием IDLE на этот раз) имени файла, содержащего CJK идеограммы, которые, безусловно, являются не представима в моем наборе символов по умолчанию:

IDLE 2.6.4  
>>> import os 
>>> from pprint import pprint as pp 

магнезии (результаты Unicode) выглядит отлично

>>> pp(list(os.walk(ur"c:\junk\terabytest\chinese"))) 
[(u'c:\\junk\\terabytest\\chinese', [], [u'nihao\u4f60\u597d.txt'])] 

и unicode отображает только штраф в IDLE:

>>> print list(os.walk(ur"c:\junk\terabytest\chinese"))[0][2][0] 
nihao你好.txt 

Результат линии, очевидно, производится с использованием.кодировать (что бы то ни было, «заменить») - не очень полезно, например. вы не можете открыть файл, передав это имя файла.

>>> pp(list(os.walk(r"c:\junk\terabytest\chinese"))) 
[('c:\\junk\\terabytest\\chinese', [], ['nihao??.txt'])] 

Поэтому вывод, что для достижения наилучших результатов, нужно передать строку Юникода в os.walk(), и иметь дело с любыми проблемами отображения.

+0

сделано, как сейчас? –

+0

проблема заключается в том, что исключение происходит в исключении, скорее всего из-за того, что кодировка внутри try также вызывает одно и то же исключение, и я не знаю, как получить дополнительную информацию об этом (например, какой символ вызывает это или где указанный файл/папка, расположенная на моем жестком диске) –

+0

@terabytest: «не знаю, как получить дополнительную информацию»? Прочитали ли вы отредактированный ответ, особенно части (1) и (3), где он упоминает функцию 'repr()'? –

1

Вы используете эту программу в окне cmd.exe Windows? Если это так, попробуйте запустить его в IDLE и посмотреть, есть ли у вас одинаковые ошибки. В поле Cmd.exe не выполняется unicode, а только ascii.

+0

Я запускаю это в IDLE –

2

Вы пытаетесь выполнить какое-либо действие (например, печать) в строке юникода, которая содержит символы, отличные от ASCII, и строка по умолчанию преобразуется в ascii. Вам нужно будет указать кодировку, чтобы правильно представлять строку.
Это поможет значительно, если вы разместите несколько примеров кода того, что вы пытаетесь сделать.

Самый простой способ сделать это было бы:
s = u'ma\xf1ana';
print s.encode('latin-1');

Отредактировано после деталей, добавленных к вопросу:

В вашем случае вам нужно декодировать строку, которую вы прочитать первый:
f.decode();,
Попробуйте изменить
u"%s/%s" % (folder, f)
к
os.path.join(folder, f.decode())

Обратите внимание, что кодировка «Latin-1» может быть необходимо изменить на то, что файл называется с

PS: Джон Мачин упомянул очень полезные способы улучшить и зачистить код. +1

+0

Да, я пытаюсь напечатать строку. Как я могу сказать, что не использовать ascii? –

+0

Простейшим примером может быть следующее: s = u'ma \ xf1ana ';
печать s.encode ('latin-1') – artdanil

+0

не может получить комментарий для правильного отображения кода образца, поэтому я положил его в ответ. – artdanil

1

Некоторые Юникода элементы:

  • кладя # encoding: utf-8 в верхней части файла иногда помогают (если ваш редактор использует UTF-8, чтобы сохранить файл ...)
  • s = "i'm a string"
  • u = u"i'm unicode, at least in python < ۳"
  • Если ваша работа с файлами попытается заглянуть в модуль codecs.

Дальнейшие показания:

1
u"%s" % f 

В разных местах вы делаете что-то похожее на приведенный выше код. Это неверный способ преобразования объекта str в объект unicode, поскольку преобразование выполняется с помощью sys.getdefaultencoding() (ascii), что почти гарантировано.

Вы должны использовать методы кодирования/декодирования для преобразования в/из объекта юникода. Это требует знания того, что кодирует ваш вход (строки, возвращенные из os.walk). Например, если имена файлов закодированы в UTF-8

uf = f.decode('utf-8') 

будет интерпретировать е как UTF-8, кодируемого последовательностью байтов и вернуть правильный объект Юникода. Аналогично, когда вам нужно вывести объект unicode, вы должны преобразовать его обратно в str, указав действительную кодировку, которую вы хотите вывести.

print uf.encode('utf-8') 
+0

Я все еще получаю тот же UnicodeDecodeError: кодек ascii не может декодировать байт 0x99 в позиции 125: порядковый номер не в диапазоне (128), хотя я написал print «Ошибка чтения файла% s»% («% s /% s») % (папка, f)). decode ("utf-8") ... Wth –

+0

В этом разделе описываются пути к файлам Windows, поэтому utf8 примерно так же важен, как и latin1. –

+0

Мой пост был до того, как он добавил эту информацию и должен был быть общей информацией, объясняющей проблемы с используемым подходом. Понимание этих проблем помогает, независимо от того, что используется фактическая кодировка. К сожалению, мой пост был сделан по номиналу, а не в качестве общего описания. – jamessan

-1

а не делать:

print "Error reading file %s"%u"%s/%s"%(folder, f) 

Попробуйте это:

print "Error reading file %s"%u"%s/%s"%(folder.encode('ascii','ignore'), f.encode('ascii','ignore')) 

Поскольку консоль не может печатать Юникод символов, вы можете посмотрите правильное название. «ignore» сообщает кодеку пропустить эти символы. вы также можете использовать «replace» (печатает «?»), «xmlcharrefreplace» (заменяет & x #### кодовой точки), «backslashreplace» (заменяется кодом \ x ######)

Вам нужно будет закодировать каждую строку в Юникоде, такую ​​как печать.

+0

Я все еще получаю этот UnicodeDecodeError: кодек ascii не может декодировать байт 0x99 в позиции 25: порядковый не в диапазоне (128) это mistery –

+0

вы кодировали 'u' также? Я не заметил, что – Knio

+0

И использование «ignore» позволит ему увидеть «правильное имя» ??? –

0

У меня было несчастье работать в некоторых кодах, которые не соответствовали их кодировке.

Это функция, которую мы использовали, чтобы помочь очистить его:

def to_unicode(value): 
    if isinstance(value, unicode): 
     return value 
    elif isinstance(value, str): 
     try: 
      if value.startswith('\xff\xfe'): 
       return value.decode('utf-16-le') 
      elif value.startswith('\xfe\xff'): 
       return value.decode('utf-16-be') 
      else: 
       return value.decode('utf-8') 
     except UnicodeDecodeError: 
      return value.decode('latin-1') 
    else: 
     try: 
      return unicode(value) 
     except UnicodeError: 
      return to_unicode(str(value)) 
     except TypeError: 
      if hasattr(value, '__unicode__'): 
       return value.__unicode__() 

Так с помощью этой функции вы можете использовать:

print u"Error reading file %s/%s" % (to_unicode(folder), to_unicode(f)) 
+0

Что заставляет вас думать, что имена каталогов и файлов, возвращаемые os.walk() в Windows, не будут кодироваться последовательно? Эти имена не будут иметь спецификаций UTF-16, поэтому ваш код будет пытаться использовать UTF8, который завершится неудачей в любом байте, отличном от ASCII, и в этом случае вернет строку, декодированную с использованием latin1, IOW utter frbish без указания, что есть проблема! См. Мой обновленный ответ для примера. –

+1

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

+0

Я видел, что это была общая функция to_unicode.Как я объяснил, если str-объект не закодирован в latin1 или UTF-8 и не запускается с спецификацией UTF-16, ваша подпрограмма декодирует его с помощью latin1, что НЕ полезно - поскольку LATIN1 будет декомпрессировать любую последовательность байтов БЕЗ ОШИБКИ, ваша рутина скрывает проблему. См. Мой пример, где ваша процедура принимает str, закодированную в cp1252, и возвращает unicode, содержащий управляющий символ. Такие результаты - бессмысленный мусор, и нужно сказать, что это бессмысленный мусор - как для OP, так и для ваших собственных приложений. –

6

Python использует кодировку ASCII по умолчанию, что раздражает. Если вы хотите изменить его надолго, найдите и отредактируйте файл . Загрузите файл, ищите def setencoding() и несколько строк ниже, чтобы изменить encoding = "ascii" до encoding = "utf-8". Пока, по умолчанию ASCII кодирование.