Python - проблемы с кодировкой и декодированием символов - PullRequest
2 голосов
/ 26 марта 2012
  • У меня есть 1 исходный файл с символами utf-8 (имена)
  • У меня есть 1 файл с той же кодировкой символов.
  • Я работаю с HTML-страницей, вставляю и вырезаю полезное информация для меня в файл.
  • Я использую символы "éáűúőóüöäđĐ" в моем текстовом файле "friendsNames".

И я дал эту ошибку:

Traceback (most recent call last):
  File "C:\Users\Rendszergazda\workspace\achievements\hiba.py", line 9, in <module>
    s = str(urlopen("http://eu.battle.net/wow/en/character/arathor/"+str(names[0])+"/achievement").read(), encoding='utf-8')
  File "C:\Python27\lib\encodings\cp1250.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_table)
UnicodeEncodeError: 'charmap' codec can't encode character u'\ufeff' in position 0: character maps to <undefined>

Что вы думаете? В чем моя проблема?

from urllib import urlopen
import codecs

result = codecs.open("C:\Users\Desktop\Achievements\Result.txt", "a", "utf-8")
fh = codecs.open("C:\Users\Desktop\Achievements\FriendsNames.txt", "r", "utf-8")
line = fh.readline()
names = line.split(" ")
fh.close()

s = urlopen("http://eu.battle.net/wow/en/character/arathor/"+str(names[0])+"/achievement").read(), encoding='utf8')
result.write(str(s))
result.close()

1 Ответ

2 голосов
/ 26 марта 2012

Проблема в том, что вы звоните str(array[0]), где array[0] - это строка в Unicode.Это означает, что он будет закодирован в кодировке по умолчанию, которая по некоторым причинам в вашем случае выглядит как cp1250.(Вы связались с sys.setdefaultencoding()? Не делайте этого.)

Чтобы получить строки байтов из юникода, вы должны явно кодировать юникод.Не просто позвоните str() на это.Закодируйте его, используя кодировку, которую должен иметь результат (что в случае URL довольно сложно угадать, но в этом случае, вероятно, UTF-8.) Итак, используйте `array [0] .encode ('utf-8').Вам также может потребоваться заключить в URL URL-адреса, отличные от ASCII, хотя это зависит от того, что ожидает удаленный конец.

...