Найти - Пользователи
Полная версия: механизм перекодировки файлов
Начало » Python для новичков » механизм перекодировки файлов
1
ilnur
привет.

Подскажите пожалуйста, как происходит перекодировка строк из одной кодировки в другую?
Например, из utf-8 в cp1251.
я предполагаю что каждому u'\u0497' соответствует конкретный байт из cp1251?
А если такого соответствия нет, то получаем ошибку EncodeError.

конкретно столкнулся с такой проблемой. encode татарских символов в cp1251
>>> f = open('1.txt', 'w')
>>> f.write((u'Шамилҗ').encode('cp1251'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/encodings/cp1251.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_table)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u0497' in position 5: character maps to <undefined>
bismigalis
в CP1251 разве есть татарские символы?
http://ru.wikipedia.org/wiki/Windows-1251

EDIT: пролистал вниз и увидел разные подварианты, но я думаю это хаки под конкретную локализацию, python об этом ничего не знает
ilnur
нет их там.

Поэтому и интересовался про механизм кодировки.
Наверное придется делать такой костыль?
u'Шамилҗ'.replace(u'җ', u'ж')
bismigalis
в CP1251 стоит символ ‘ќ’ на месте ‘җ’ в татарском варианте
т.е. я думаю можно сделать так

text = u'Шамилҗ'
text.replace(u'җ', u'ќ')
text.encode('cp1251')

чтобы в итоге получить татарский текст
ilnur
но если пользователь откроет этот файл. Со шрифтом без поддержки татарского, то у него отобразится ќ. что введет в его заблуждение что у него что-то сломалось.

за идею спасибо. Приму к сведению.
py.user.next
ilnur
Подскажите пожалуйста, как происходит перекодировка строк из одной кодировки в другую?
Например, из utf-8 в cp1251.
в третьем питоне ты раскодируешь байты из utf-8 в кодовые точки unicode (unicode - это не кодировка), затем из кодовых точек unicode ты кодируешь в байты в cp1251

utf-8 - это кодировка для unicode (65536 * 17 = 1114112 кодовых точек)
то есть она может закодировать в виде байтов любую кодовую точку юникода

в то время как cp1251 - это однобайтовая кодировка, которая может закодировать только 256 кодовых точек юникода

соответственно, из cp1251 в utf-8 ты всегда можешь перевести байты, а из utf-8 в cp1251 - только когда там закодирована кодовая точка, представимая в cp1251
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB