【问题标题】:Python chr() function outputting incorrectlyPython chr() 函数输出不正确
【发布时间】:2015-11-23 14:53:24
【问题描述】:

我遇到了 chr() 函数的问题。我的代码首先获取用户输入,将其放入一个数组中,然后使用 ord 函数将其转换为相应的数字值,并对关键字执行相同操作。然后它使用 zip 函数将两个数组加在一起以获取数字,并使用其上的 chr 函数将其放回文本。问题是chr函数输出不正确

例如

c的数值是99

h的数值是104

它们加起来就是 203

我的代码输出\xcb

当我做了一个单独的代码时

leb = chr(203)
print leb

输出 203 为 Ë 这是一个单数字符,我需要解码它

这是我的代码

num_string = raw_input("enter what you would like to encrypt")
num_list = []
for num in num_string:
    num_list.append(ord(num)) 
    print num_list

key_string = raw_input("enter the keyword")
key_list = []
for key in key_string:
   key_string = key_list.append(ord(key)) 
   print key_list

end_string = [x + y for x, y in zip(num_list, key_list)]
end_list = []
print end_string
for end in end_string:
    end_list.append(chr(end)) 
print end_list

运行时这是输出

输入你想加密的猫

[99]

[99, 97]

[99, 97, 116]

输入关键字帽子

[104]

[104, 97]

[104, 97, 116]

[203, 194, 232]

['\xcb', '\xc2', '\xe8']

为什么我的代码会这样,我该如何解决?

【问题讨论】:

  • ASCII码最多可达127
  • 我不知道您在看什么 ascii 表,但即使使用扩展的 ascii 表 203 也不等于 Ë。 asciitable.com
  • 您所期望的是特殊代码页中的字符\xcb。没有错,只是您对结果的期望。
  • 打印列表使用__repr__,而不是__str__,来显示列表的内容。
  • @Pynchia:ASCII 码最多可运行 127 个,但 Python 允许 [0-255] 范围内的简单字节字符。 ASCII 中的下半部分,解释或上半部分取决于系统编码。在 latin1 中,代码 0xcb (203) 字符 u'\xcb'Ë

标签: python chr


【解决方案1】:

一切都很正常。这只是字符串的值(带引号)与在系统代码页中转换后的字符串打印之间的区别。在 latin1 代码页中,字符 '\xcb'(代码 203)有效地打印为 Ë

但是打印一个列表和打印它的值是不一样的,让我们忘记使用高于 127 的代码的字符,看看这个:

>>> l = [ 'a', 'b', 'c']
>>> print l
['a', 'b', 'c']
>>> print ','.join(l)
a,b,c

因此,当打印字符串列表时,Python 会以其表示形式打印每个元素,即用引号括起来。所以在你的例子中,(假设你的系统编码 latin1),你可以写:

...
print end_list
print ''.join(end_list)

你会得到预期的结果:

['\xcb', '\xc2', '\xe8']
ËÂè

【讨论】:

  • 赞成。顺便说一句,您的示例/解决方案在 UTF-8(Python 3 上的默认值)中同样有效
【解决方案2】:

正如这个 SO 问题 (python: extended ASCII codes) 中所建议的,没有“扩展 Ascii”之类的东西。

输出是正确的(\xcb = 12 * 2^4 + 11 * 2^0),但它显然不是您要查找的编码,因此您可能想弄清楚您要查找的编码是什么for 然后查阅内置编码函数的 Python 文档。

【讨论】:

  • 我制作了一段单独的代码,并在 203 上使用了 chr,它输出了 Ë。那么为什么它在这段代码中输出/xcb。为什么 chr 在给出相同的数字时给出两个不同的答案?
猜你喜欢
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多