Как отмечает Винко, в Latin-1 или ISO 8859-1 нет печатных символов для восьмеричной строки, которую вы цитируете. Согласно моим примечаниям для 8859-1, «Элементы управления C1 (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
МАЛЕНЬКОЕ ПИСЬМО А ЛАТИНЫ С CIRCUMFLEX - 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()
. Поскольку мы не можем видеть, как увеличивается intCounter, мы не можем определить, будет ли он циклически изменяться от 0 до 255 или монотонно ли он увеличивается. Если последнее, то вам нужно выражение, такое как:
chr(mod(ord(c) - mod(intCounter, 255) + 479, 255))
где 256 - 33 = 223, конечно, и 479 = 256 + 223. Это гарантирует, что значение, переданное в chr()
, положительно и находится в диапазоне 0..255 для любого входного символа c и любого значения intCounter (и, поскольку функция mod()
никогда не получает отрицательный аргумент, она также работает независимо от того, как mod()
ведет себя, когда ее аргументы отрицательны).