Python APIで、単一文字のUnicodeコードポイントを抽出する方法はありますか?
編集:重要な場合には、Python 2.7。
>>> 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
あなたの質問を正しく理解していれば、あなたはこれを行うことができます。
>>> s='㈲'
>>> s.encode("unicode_escape")
b'\\u3232'
Unicodeエスケープコードをソース文字列として表示します。
通常、文字のコードポイントを見つけるには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()
を使用します。
これを正しく行うのはかなり難しいことがわかります。Python 2とPython 3には、文字列からUnicodeコードポイントを抽出する際に微妙な問題があります。
Python 3.3までは、2つのモードのいずれかでPythonをコンパイルできました。
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以降で一般的に使用されます。
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
に新しいモジュール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'
python2
>>> print hex(ord(u'人'))
0x4eba