web-dev-qa-db-ja.com

Pythonを使用して文字のUnicodeコードポイントを取得する

Python APIで、単一文字のUnicodeコードポイントを抽出する方法はありますか?

編集:重要な場合には、Python 2.7。

42
SK9
>>> ord(u"ć")
263
>>> u"café"[2]
u'f'
>>> u"café"[3]
u'\xe9'
>>> for c in u"café":
...     print repr(c), ord(c)
... 
u'c' 99
u'a' 97
u'f' 102
u'\xe9' 233
37
Mike Graham

あなたの質問を正しく理解していれば、あなたはこれを行うことができます。

>>> s='㈲'
>>> s.encode("unicode_escape")
b'\\u3232'

Unicodeエスケープコードをソース文字列として表示します。

49
Keith

通常、文字のコードポイントを見つけるにはord(character)を行うだけです。ただし、完全を期すために、Unicode Supplementary Multilingual Planeのワイド文字は、ナローPythonビルドのサロゲートペア(つまり2つのコード単位)として表されます。そのため、この場合、周り:

_def get_wide_ordinal(char):
    if len(char) != 2:
        return ord(char)
    return 0x10000 + (ord(char[0]) - 0xD800) * 0x400 + (ord(char[1]) - 0xDC00)
_

ただし、これはほとんどのアプリケーションではまれなので、通常はord()を使用します。

10
cryo

これを正しく行うのはかなり難しいことがわかります。Python 2とPython 3には、文字列からUnicodeコードポイントを抽出する際に微妙な問題があります。

Python 3.3までは、2つのモードのいずれかでPythonをコンパイルできました。

  1. sys.maxunicode == 0x10FFFF

このモードでは、PythonのUnicode文字列は、U + 0000からU + 10FFFFまでのすべてのUnicodeコードポイントをサポートします。 1つのコードポイントは、1つの文字列要素で表されます。

>>> import sys
>>> hex(sys.maxunicode)
'0x10ffff'
>>> len(u'\U0001F40D')
1
>>> [c for c in u'\U0001F40D']
[u'\U0001f40d']

これは、Linux上のPython 2.7のデフォルトであり、すべてのオペレーティングシステムでPython 3.3以降で一般的に使用されます。

  1. sys.maxunicode == 0xFFFF

このモードでは、PythonのUnicode文字列は、U + 0000からU + FFFFまでのUnicodeコードポイントの範囲のみをサポートします。 U + 10000からU + 10FFFFまでのコードポイントは、UTF-16エンコーディングの文字列要素のペアを使用して表されます。

>>> import sys
>>> hex(sys.maxunicode)
'0xffff'
>>> len(u'\U0001F40D')
2
>>> [c for c in u'\U0001F40D']
[u'\ud83d', u'\udc0d']

これは、macOSおよびWindows上のPython 2.7のデフォルトです。

このランタイムの違いにより、Pythonモジュールを記述してUnicode文字列を一連のコードポイントとして操作するのは非常に不便になります。

Codepointsモジュール

これを解決するために、codepointsに新しいモジュールPyPIを提供しました。

https://pypi.python.org/pypi/codepoints/1.

このモジュールは、sys.maxunicode:の基本的な設定に関係なく、APIを公開してコードポイントのリストとの間でUnicode文字列を変換することで問題を解決します。

>>> hex(sys.maxunicode)
'0xffff'
>>> snake = Tuple(codepoints.from_unicode(u'\U0001F40D'))
>>> len(snake)
1
>>> snake[0]
128013
>> hex(snake[0])
'0x1f40d'
>>> codepoints.to_unicode(snake)
u'\U0001f40d'
5
Ben Hamilton

python2

>>> print hex(ord(u'人'))
0x4eba
0
lookinghong