python unicode转int_Python3将Unicode字符串转换为int表示形式

将Unicode字符串转换为的常用方法是将其转换为字节序列。 Unicode字符是纯粹的抽象,每个字符都有自己的编号;但是,还有更多方法可将数字转换为字节流。也许最通用的方式是将字符串编码为UTF-8编码。您可以选择许多方法从中获取整数。这里是一个(我借用Ivella漂亮的字符串 - 我希望没有坏的话是内部:):

Python 3.2.1 (default, Jul 10 2011, 20:02:51) [MSC v.1500 64 bit (AMD64)] on win32

Type "copyright", "credits" or "license()" for more information.

>>> s = "Hello, World, عالَم, ދުނިޔެ, जगत, 世界"

>>> b = s.encode('utf-8')

>>> b

b'Hello, World, \xd8\xb9\xd8\xa7\xd9\x84\xd9\x8e\xd9\x85, \xde\x8b\xde\xaa\xde\x82\xde\xa8\xde\x94\xde\xac, \xe0\xa4\x9c\xe0\xa4\x97\xe0\xa4\xa4, \xe4\xb8\x96\xe7\x95\x8c'

现在我们这里有从128到255的数字的那些显示为字节序列十六进制编码转义序列。我们将所有字节转换为它们的十六进制字节作为字节串。

>>> import binascii

>>> h = binascii.hexlify(b)

>>> h

b'48656c6c6f2c20576f726c642c20d8b9d8a7d984d98ed9852c20de8bdeaade82dea8de94deac2c20e0a49ce0a497e0a4a42c20e4b896e7958c'

而且我们可以把它看作以十六进制符号写成的大数字(如文本)。 int允许我们将其转换为抽象数字 - 在打印时 - 通常更多地转换为十进制符号。现在

>>> i = int(h, 16)

>>> i

52620351230730152682202055464811384749235956796562762198329268116226267262806875102376740945811764490696968801603738907493997296927348108

你可以将它存储为一个数字,它加密(虽然它是比较平常字节更早的序列加密),后来将其转换回整数。要小心,没有很多语言(可能没有数据库)能够使用这些大整数。

让我们回到原始字符串。首先将其转换为十六进制表示(字符串)。

>>> h2 = hex(i)

>>> h2

'0x48656c6c6f2c20576f726c642c20d8b9d8a7d984d98ed9852c20de8bdeaade82dea8de94deac2c20e0a49ce0a497e0a4a42c20e4b896e7958c'

>>> h3 = h2[2:] # remove the 0x from the beginning

>>> h3

'48656c6c6f2c20576f726c642c20d8b9d8a7d984d98ed9852c20de8bdeaade82dea8de94deac2c20e0a49ce0a497e0a4a42c20e4b896e7958c'

>>> type(h3)

我们不得不删除0x,因为它只是说,其余的是代表人数的十六进制字符。请注意0​​是str类型。就像我们在Python 3中一样(请参见上方),str表示Unicode字符串。下一步是将六个数字对转换回字节。试试吧unhexlify():

>>> binascii.unhexlify(h3)

Traceback (most recent call last):

File "", line 1, in

binascii.unhexlify(h3)

TypeError: 'str' does not support the buffer interface

哎呀!它只接受字节串​​。然后,将Unicode中的每个六进制数字编码为bytestring中的六进制数字。要走的路是编码;然而,编码为ASCII是微不足道的。

>>> b2 = h3.encode('ascii') # character by character; subset of ascii only

>>> b2

b'48656c6c6f2c20576f726c642c20d8b9d8a7d984d98ed9852c20de8bdeaade82dea8de94deac2c20e0a49ce0a497e0a4a42c20e4b896e7958c'

>>> b3 = binascii.unhexlify(b2)

>>> b3

b'Hello, World, \xd8\xb9\xd8\xa7\xd9\x84\xd9\x8e\xd9\x85, \xde\x8b\xde\xaa\xde\x82\xde\xa8\xde\x94\xde\xac, \xe0\xa4\x9c\xe0\xa4\x97\xe0\xa4\xa4, \xe4\xb8\x96\xe7\x95\x8c'

现在我们有类似的字符串,跟第一个.encode('utf-8')之后相似。让我们使用逆操作 - 从UTF-8解码。我们应该得到和我们一样的Unicode字符串。

>>> s2 = b3.decode('utf-8')

>>> s2

'Hello, World, عالَم, ދުނިޔެ, जगत, 世界'

>>> s == s2 # is the original equal to the result?

True

:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值