Ответ 1
ASCII для int:
ord('a')
дает 97
И вернемся к строке:
str(unichr(97))
дает 'a'
Я работаю над созданием URL-адреса для моего сайта, и мой текущий план (я открыт для предложений) заключается в использовании идентификатора node для создания сокращенного URL-адреса. Итак, теоретически node 26 может быть short.com/z
, node 1 может быть short.com/a
, node 52 может быть short.com/z
, а node 104 может быть short.com/ZZ
. Когда пользователь переходит к этому URL-адресу, мне нужно обратить вспять процесс (очевидно).
Я могу думать о некоторых пустяковых способах этого, но я предполагаю, что есть лучшие. Любые предложения?
ASCII для int:
ord('a')
дает 97
И вернемся к строке:
str(unichr(97))
дает 'a'
>>> ord("a")
97
>>> chr(97)
'a'
Как насчет кодировки BASE58? Например, 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
Включение этого числа в число также не имеет большого значения.
Если несколько символов связаны внутри одного целого/длинного, как и моя проблема:
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))
Допустимые значения '0123456789'
и x = 227581098929683594426425L
Используйте hex(id)[2:]
и int(urlpart, 16)
. Есть и другие варианты. base32, кодирующий ваш id, мог бы работать, но я не знаю, что есть библиотека, которая кодирует base32, встроенную в Python.
По-видимому, кодер base32 был введен в Python 2.4 с base64 module. Вы можете попробовать использовать b32encode
и b32decode
. Вы должны дать True
для параметров casefold
и map01
для b32decode
, если люди запишут ваши сокращенные URL-адреса.
Собственно, я забираю это. Я по-прежнему считаю, что кодировка base32 - хорошая идея, но этот модуль не подходит для сокращения URL-адресов. Вы можете посмотреть на реализацию в модуле и сделать свой собственный для этого конкретного случая.: -)