Как отмечает Vinko, Latin-1 или ISO 8859-1 не имеют печатных символов для восьмеричной строки, которую вы цитируете. Согласно моим заметкам для 8859-1, «C1 Controls (0x80 - 0x9F) взяты из ISO/IEC 6429: 1992. Он не определяет имена для 80, 81 или 99». Имена кодовой точки являются Винко перечисляет их:
\222 = 0x92 => PRIVATE USE TWO
\223 = 0x93 => SET TRANSMIT STATE
\225 = 0x95 => MESSAGE WAITING
Правильный UTF-8 кодировке из них является (Unicode, двоичный, шестнадцатеричный):
U+0092 = %11000010 %10010010 = 0xC2 0x92
U+0093 = %11000010 %10010011 = 0xC2 0x93
U+0095 = %11000010 %10010101 = 0xC2 0x95
Латинского МАЛЫЙ буква А С циркумфлексом является ISO 8859-1 код 0xE2 и, следовательно, Unicode U + 00E2; в UTF-8, то есть% 11000011% 10100010 или 0xC3 0xA2.
CENT SIGN - код ISO 8859-1 0xA2 и, следовательно, Unicode U + 00A2; в UTF-8, то есть% 11000011% 10000010 или 0xC3 0x82.
Итак, независимо от того, что вы видите, вы, похоже, не видите кодировку UTF-8 стандарта ISO 8859-1. Все остальное, вы видите, но 5 байтов, где вам нужно будет увидеть 8.
Добавлено: Предыдущая часть ответа рассматривает претензии «UTF-8 кодировке», но игнорирует остальную часть вопроса, в котором говорится:
Now I need to pass the string into a function that does this operation:
strdecryptedPassword + chr(ord(c) - 3 - intCounter - 30)
I get this error: chr() arg not in range(256). If I try to encode the
string as Latin-1 first I get this error: 'latin-1' codec can't encode
characters in position 0-3: ordinal not in range(256).
Вы на самом деле не показывают нам как intCounter определен, но если он слегка увеличивается на символ, рано или поздно «ord(c) - 3 - intCounter - 30
» будет отрицательным (и, кстати, почему бы не объединить константы и не использовать «ord(c) - intCounter - 33
»?), в этот момент chr()
вероятно, будет жаловаться. Вам нужно будет добавить 256, если значение отрицательное, или используйте операцию модуля, чтобы обеспечить положительное значение от 0 до 255, чтобы перейти к chr()
. Поскольку мы не можем видеть, как инкремент инкрементируется, мы не можем определить, имеет ли он цикл от 0 до 255 или монотонно увеличивается. Если последнее, то вам необходимо выражение таких как:
chr(mod(ord(c) - mod(intCounter, 255) + 479, 255))
, где 256 - 33 = 223, конечно, и 479 = 256 + 223. Это гарантирует, что значение, переданное в chr()
является положительной, и в диапазоне 0..255 для любого входного символа c и любого значения intCounter (и, поскольку функция mod()
никогда не получает отрицательный аргумент, она также работает независимо от того, как ведет себя mod()
, когда ее аргументы отрицательны).
Пожалуйста, введите фактический код с реальным примером строки, потому что u '\ 222 \ 222 \ 223 \ 225'.encode (' latin-1 ') работает для меня – 2008-11-08 05:47:40
и для c в u' \ 222 \ 222 \ 223 \ 225 ': print chr (ord (c) - 33) также работает. Он также работает со строковыми объектами. – 2008-11-08 05:49:09