正如 Vinko 所指出的,Latin-1 或 ISO 8859-1 没有您引用的八进制字符串的可打印字符。根据我对 8859-1 的注释,“C1 控件 (0x80 - 0x9F) 来自 ISO/IEC 6429:1992。它没有定义 80、81 或 99 的名称”。代码点名称与 Vinko 列出的一样:
\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 的拉丁文小写字母 A 是 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。
因此,无论您看到什么,您似乎都没有看到 ISO 8859-1 的 UTF-8 编码。除此以外,您只看到 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()
是正数,并且对于任何输入字符 c 和任何 intCounter 值都在 0..255 范围内(并且,因为mod()
函数永远不会得到否定的论点,不管mod()
它的论点是否定的时行为如何,它也可以工作)。