#source file is encoded in utf8
import urllib2
import re
req = urllib2.urlopen('http://people.w3.org/rishida/scripts/samples/hungarian.html')
c = req.read()#.decode('utf-8')
p = r'title="This is Latin script \(Hungarian language\)">(.+)'
text = re.search(p, c).group(1)
name = text[:10]+'.txt' #file name will have special chars in it
f = open(name, 'wb')
f.write(text) #content of file will have special chars in it
f.close()
x = raw_input('done')
Как вы можете видеть, скрипт выполняет несколько действий: - Считывает содержимое, для которого известно, что у него есть символы Юникода, с веб-страницы в переменную
(Исходный файл сохраняется в utf-8, ноэто не должно иметь значения, если только строки юникода фактически не определены в исходном коде ... Как вы можете видеть, строка юникода определяется динамически в переменную ... какая кодировка источника не должна иметь значения в этом сценарии)
- Записывает файл с именем, содержащим символы Unicode
- Также записывает содержимое Unicode в этот файл
Вот странное поведение, которое я получаю (Windows 7,Python 2.7): Когда я не использую функцию декодирования:
c = req.read()
ИМЯ файла будет выдаваться бессмысленно, но СОДЕРЖАНИЕ файла будет читабельным (то есть вы можете увидетьисправьте юникодные венгерские символы)
Тем не менее, когда я ИСПОЛЬЗУЮ функцию декодирования:
c = req.read().decode('utf-8')
НЕ ОШИБКА при открытии файла (действительно при его создании)с режимом 'w'), и полученное имя файла будет доступно для чтения, да, теперь оно показывает правильные символы Юникода.
Пока все хорошо, верно?Что ж, тогда ОШИБКА будет пытаться записать содержимое файла в кодировке Юникод:
f.write(text) #content of file will have special chars in it
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in position 8: ordinal not in range(128)
Видите ли, у меня не может быть торта и есть его тоже ... Либо я могу правильно написатьИМЯ файла или я могу правильно написать СОДЕРЖАНИЕ файла ..
Как я могу сделать оба?
Я также пытался написать файл с
f = codecs.open(name, encoding='utf-8', mode='wb')
Но это тоже ошибки ..