Unicode文字列を数値に変換する通常の方法は、それをバイトシーケンスに変換することです。Unicode文字は純粋な抽象化であり、各文字には独自の番号があります。ただし、数値をバイトのストリームに変換する方法は他にもあります。おそらくそれを行う最も用途の広い方法は、文字列をUTF-8エンコーディングにエンコードすることです。あなたはそれから整数を得る多くの方法を選ぶことができます。これが1つです(私は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の番号のバイトが16進数でコード化されたエスケープシーケンスとして表示されるバイトシーケンスができました。すべてのバイトをバイト文字列として16進コードに変換してみましょう。
>>> import binascii
>>> h = binascii.hexlify(b)
>>> h
b'48656c6c6f2c20576f726c642c20d8b9d8a7d984d98ed9852c20de8bdeaade82dea8de94deac2c20e0a49ce0a497e0a4a42c20e4b896e7958c'
そして、16進表記で(テキストとして)書かれた大きな数としてそれを見ることができます。int
を使用すると、それを抽象数に変換できます。これは、印刷されると、通常は10進表記に変換されます。
>>> i = int(h, 16)
>>> i
52620351230730152682202055464811384749235956796562762198329268116226267262806875102376740945811764490696968801603738907493997296927348108
これで、数値として保存し、暗号化して(ただし、以前のバイトシーケンスを暗号化するのが一般的です)、後で整数に変換し直すことができます。その大きな整数を処理できる言語は多くない(そしておそらくデータベースがない)ことに注意してください。
元の文字列に戻りましょう。まず、16進表現(文字列)に変換します。
>>> h2 = hex(i)
>>> h2
'0x48656c6c6f2c20576f726c642c20d8b9d8a7d984d98ed9852c20de8bdeaade82dea8de94deac2c20e0a49ce0a497e0a4a42c20e4b896e7958c'
>>> h3 = h2[2:] # remove the 0x from the beginning
>>> h3
'48656c6c6f2c20576f726c642c20d8b9d8a7d984d98ed9852c20de8bdeaade82dea8de94deac2c20e0a49ce0a497e0a4a42c20e4b896e7958c'
>>> type(h3)
<class 'str'>
0x
残りは数字を表す16進文字であるとだけ書かれているので、を削除する必要がありました。h3
がstr
タイプであることに注意してください。Python 3(上部を参照)の場合、str
はUnicode文字列を意味します。次のステップは、6つの数字のカップルをバイトに戻すことです。試してみましょうunhexlify()
:
>>> binascii.unhexlify(h3)
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
binascii.unhexlify(h3)
TypeError: 'str' does not support the buffer interface
おっと!バイト文字列のみを受け入れます。次に、Unicodeの各16進数をバイト文字列の16進数にエンコードします。行く方法はエンコードすることです。ただし、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
:)