Кодирование символов с помощью ISO 8859-1 в Python

С помощью ord(ch) вы можете получить числовой код для символов от ch до 127. Есть ли какая-либо функция, которая возвращает число от 0 до 255, чтобы охватить также ISO 8859-1 символов?
Изменить: соответствует моей последней версии кода и ошибке, которую я получаю

#!/usr/bin/python
# coding: iso-8859-1

import sys
reload(sys)
sys.setdefaultencoding('iso-8859-1')
print sys.getdefaultencoding()  # prints "iso-8859-1" 

def char_code(c):
    return ord(c.encode('iso-8859-1'))
print char_code(u'à')

Я получаю сообщение об ошибке: TypeError: ord() ожидал символ, но нашел строку длины 2


person Drimades Boy    schedule 20.08.2015    source источник


Ответы (3)


Когда вы начинаете со строки Unicode, вам нужно encode, а не decode.

>>> def char_code(c):
        return ord(c.encode('iso-8859-1'))

>>> print char_code(u'à')
224

В частности, для ISO-8859-1 вам вообще не нужно его кодировать, поскольку Unicode использует символы ISO-8859-1 для своих первых 256 кодовых точек.

>>> print ord(u'à')
224

Изменить: теперь я вижу проблему. Вы дали комментарий к кодировке исходного кода, указывающий, что исходный код находится в формате ISO. -8859-1. Однако готов поспорить, что ваш редактор на самом деле работает в UTF-8. Исходный код будет неправильно интерпретирован, и односимвольная строка, которую вы, как вам кажется, создали, на самом деле будет состоять из двух символов. Попробуйте следующее, чтобы увидеть:

print len(u'à')

Если ваша кодировка верна, она вернет 1, но в вашем случае это, вероятно, 2.

person Mark Ransom    schedule 20.08.2015
comment
Я попробовал оба предложенных вами способа, но все равно получаю ту же ошибку. - person Drimades Boy; 20.08.2015
comment
@DrimadesBoy, тогда ваш пример неверен, обновите его кодом, который действительно демонстрирует ошибку. - person Mark Ransom; 21.08.2015
comment
Решено. Я использую Geany в Ubuntu и изменил кодировку файла с «utf-8» на «iso-8859-1» из «Документ» › «Установить кодировку» › «Западноевропейская» › ISO-8859-1. - person Drimades Boy; 21.08.2015
comment
@DrimadesBoy, если проблема решена, установите флажок, чтобы все знали об этом. И было бы неплохо проголосовать. - person Mark Ransom; 22.08.2015

Вы можете получить ord() за что угодно. Как и следовало ожидать, ord(u'????') работает нормально, если вы можете правильно представить символ в исходном коде и/или прочитать его. в известной кодировке.

Ваше сообщение об ошибке смутно предполагает, что coding: iso-8859-1 на самом деле не соответствует действительности, а кодировка файла на самом деле является чем-то другим (мне кажется, UTF-8 или UTF-16).

Канонический обязательный к прочтению кодировщик символов в Python: http://nedbatchelder.com/text/unipain.html< /а>

person tripleee    schedule 20.08.2015
comment
Возможно, посмотрите на character-encoding tag wiki некоторые подсказки. - person tripleee; 20.08.2015

Вы все еще можете использовать ord(), но вы должны его расшифровать.

Как это:

def char_code(c):
    return ord(c.decode('iso-8859-1'))
person Rafael Telles    schedule 20.08.2015
comment
Используя print char_code(u'????'), я получаю: Не-ASCII-символ '\xf0' в файле unicode.py в строке 4, но кодировка не объявлена; - person Drimades Boy; 20.08.2015
comment
Этот символ отсутствует в ISO-8859-1, проверьте таблицу. - person Rafael Telles; 20.08.2015
comment
И вы должны указать заголовок кодировки. - person Rafael Telles; 20.08.2015
comment
Сообщение об ошибке предполагает, что заголовок coding: неверен. Если вы объявляете кодировку ISO-8859-1, но фактическая кодировка файла — UTF-8 (или UTF16), это ожидаемое сообщение об ошибке. - person tripleee; 20.08.2015