将int转换为ASCII并返回Python

mli*_*ner 123 python ascii encode integer

我正在为我的网站制作一个URL缩短器,我当前的计划(我愿意接受建议)是使用节点ID来生成缩短的URL.因此,理论上,节点26可能是short.com/z,节点1可能是short.com/a,节点52可能是short.com/Z,节点104可能是short.com/ZZ.当用户访问该URL时,我需要反转该过程(显然).

我可以想到一些方法可以解决这个问题,但我猜测有更好的方法.有什么建议?

Dom*_*mra 216

ASCII到int:

ord('a')
Run Code Online (Sandbox Code Playgroud)

97

并回到一个字符串:

  • 在Python2中: str(unichr(97))
  • 在Python3中: str(chr(97))

'a'

  • 而在python3中只是chr()! (77认同)
  • chr()也适用于2.6:`>>> chr(97)`>`'a'` (22认同)
  • chr 字符范围内的 ascii 字符(0 - 255),但是,unichr 适用于 unicode 字符集。 (2认同)

ren*_*tov 85

>>> ord("a")
97
>>> chr(97)
'a'
Run Code Online (Sandbox Code Playgroud)


Mat*_*vis 8

如果多个字符绑定在一个整数/长整数内,那么我的问题是:

s = '0123456789'
nchars = len(s)
# string to int or long. Type depends on nchars
x = sum(ord(s[byte])<<8*(nchars-byte-1) for byte in range(nchars))
# int or long to string
''.join(chr((x>>8*(nchars-byte-1))&0xFF) for byte in range(nchars))
Run Code Online (Sandbox Code Playgroud)

产量'0123456789'x = 227581098929683594426425L

  • 感谢您的询问。考虑到base64或base58编码最适用,我将授予它与OP中的用例略有不同的地方。我已经基于标题到达了这个问题,实际上是将整数转换为ascii文本,就好像该整数在其字节中嵌入了ascii编码的数据一样。如果其他人以相同的期望结果到达这里,我便发布了此答案。 (2认同)

Ivo*_*zel 7

BASE58编码URL怎么样?比如flickr就好.

# note the missing lowercase L and the zero etc.
BASE58 = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ' 
url = ''
while node_id >= 58:
    div, mod = divmod(node_id, 58)
    url = BASE58[mod] + url
    node_id = int(div)

return 'http://short.com/%s' % BASE58[node_id] + url
Run Code Online (Sandbox Code Playgroud)

把它转回一个数字也不是什么大问题.

  • 这很棒.我最后在SO上找到了另一个(更完整的)答案:http://stackoverflow.com/questions/1119722/base-62-conversion-in-python (2认同)

Omn*_*ous 0

使用hex(id)[2:]int(urlpart, 16). 还有其他选择。Base32 编码你的 id 也可以工作,但我不知道有任何库可以在 Python 中内置 Base32 编码。

显然,Python 2.4 中引入了 base32 编码器和base64 模块。您可以尝试使用b32encodeb32decode。您应该提供Truecasefold选项map01b32decode以防人们写下您缩短的 URL。

事实上,我收回那句话。我仍然认为 base32 编码是一个好主意,但该模块对于 URL 缩短的情况没有用。您可以查看模块中的实现,并针对此特定情况自行实现。:-)