1つのエンコーディングで整数として文字コードを指定した場合、たとえばutf-8で文字コードを取得し、再び整数として取得するにはどうすればよいでしょうか。
3 に答える
UTF-8は可変長エンコーディングなので、実際には「ユニコードコードポイント」を意味していると思います。を使用chr()
して文字コードを文字に変換し、デコードしてord()
、コードポイントを取得するために使用します。
>>> ord(chr(145).decode('koi8-r'))
9618
両方がシングルバイトエンコーディングである場合にのみ、あるエンコーディングから別のエンコーディングに「整数」をマップできます。
「iso-8859-15」と「cp1252」(別名「ANSI」)を使用した例を次に示します。
>>> s = u'€'
>>> s.encode('iso-8859-15')
'\xa4'
>>> s.encode('cp1252')
'\x80'
>>> ord(s.encode('cp1252'))
128
>>> ord(s.encode('iso-8859-15'))
164
ここでは、エンコードされたバイトord
の序数を取得するために使用されていることに注意してください。元のUnicode文字列で使用すると、そのUnicodeコードポイントが得られます。ord
>>> ord(s)
8364
の逆の操作は、(からの範囲のコードの場合)または(からの範囲のコードの場合)のord
いずれかを使用して実行できます。chr
0
127
unichr
0
sys.maxunicode
>>> print chr(65)
A
>>> print unichr(8364)
€
マルチバイトエンコーディングの場合、通常、単純な「整数」マッピングは不可能です。
上記と同じ例ですが、「iso-8859-15」と「utf-8」を使用しています。
>>> s = u'€'
>>> s.encode('iso-8859-15')
'\xa4'
>>> s.encode('utf-8')
'\xe2\x82\xac'
>>> [ord(c) for c in s.encode('iso-8859-15')]
[164]
>>> [ord(c) for c in s.encode('utf-8')]
[226, 130, 172]
「utf-8」エンコーディングでは、3バイトを使用して同じ文字をエンコードするため、1対1のマッピングはできません。そうは言っても、多くのエンコーディング( "utf-8"を含む)はASCII互換になるように設計されているため、通常、0から127の範囲のコードに対してマッピングが可能です(ただし、コードは常に同じであるため、些細なことです。 )。
エンコード/デコードダンスがどのように機能するかの例を次に示します。
>>> s = b'd\x06' # perhaps start with bytes encoded in utf-16
>>> map(ord, s) # show those bytes as integers
[100, 6]
>>> u = s.decode('utf-16') # turn the bytes into unicode
>>> print u # show what the character looks like
٤
>>> print ord(u) # show the unicode code point as an integer
1636
>>> t = u.encode('utf-8') # turn the unicode into bytes with a different encoding
>>> map(ord, t) # show that encoding as integers
[217, 164]
お役に立てれば :-)
整数から直接Unicodeを作成する必要がある場合は、unichrを使用してください。
>>> u = unichr(1636)
>>> print u
٤