正如 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
带圆圈的拉丁文小写字母 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() 在其参数是否为负时的行为如何,它都可以工作)。