17

1つのエンコーディングで整数として文字コードを指定した場合、たとえばutf-8で文字コードを取得し、再び整数として取得するにはどうすればよいでしょうか。

4

3 に答える 3

14

UTF-8は可変長エンコーディングなので、実際には「ユニコードコードポイント」を意味していると思います。を使用chr()して文字コードを文字に変換し、デコードしてord()、コードポイントを取得するために使用します。

>>> ord(chr(145).decode('koi8-r'))
9618
于 2011-12-22T07:24:43.993 に答える
12

両方がシングルバイトエンコーディングである場合にのみ、あるエンコーディングから別のエンコーディングに「整数」をマップできます。

「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いずれかを使用して実行できます。chr0127unichr0sys.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の範囲のコードに対してマッピング可能です(ただし、コードは常に同じであるため、些細なことです。 )。

于 2011-12-22T19:56:24.863 に答える
2

エンコード/デコードダンスがどのように機能するかの例を次に示します。

>>> 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
٤
于 2011-12-22T07:55:33.407 に答える