web-dev-qa-db-ja.com

python 3で絵文字をUnicodeに、またはその逆に変換する

python 3.で絵文字をUnicodeに変換しようとしています。たとえば、絵文字は????で、これから対応するUnicode 'U + 1F600'を取得したいと思います。同様に、「U + 1F600」を「????」に変換したいので、ドキュメントを読んでいくつかのオプションを試しましたが、Pythonの動作が混乱しています。

>>> x = '????'
>>> y = x.encode('utf-8')
>>> y
b'\xf0\x9f\x98\x80'

絵文字はバイトオブジェクトに変換されます。

>>> z = y.decode('utf-8')
>>> z
'????'

これまでのところ、バイトオブジェクトを絵文字に変換し直しました。

次に、絵文字のユニコードを取得します。

>>> c = '\U0001F600'
>>> d = c.encode('utf-8')
>>> d
>>> b'\xf0\x9f\x98\x80'

これにより、バイトエンコーディングが再度出力されます。

>>> d.decode('utf-8')
>>> '????'

これにより、絵文字が再び出力されます。ユニコードと絵文字だけを変換する方法を本当に理解することはできません。

10
imc

「????」はすでにUnicodeオブジェクトです。 UTF-8はUnicodeではなく、Unicodeのバイトエンコーディングです。 Unicode文字のコードポイント番号を取得するには、ord関数を使用できます。そして、希望する形式で印刷するには、16進数としてフォーマットできます。このような:

s = '????'
print('U+{:X}'.format(ord(s)))

output

U+1F600

Python 3.6+の場合、f-stringを使用してさらに短く(そしてより効率的に)できます:

s = '????'
print(f'U+{ord(s):X}')

ところで、'\U0001F600'のようなUnicodeエスケープシーケンスを作成する場合は、'unicode-escape'コーデックがあります。ただし、bytes文字列を返すので、それをテキストに戻すこともできます。そのために「UTF-8」コーデックを使用できますが、有効なASCIIのみが含まれることが保証されているため、「ASCII」コーデックを使用することもできます。

s = '????'
print(s.encode('unicode-escape'))
print(s.encode('unicode-escape').decode('ASCII'))

output

b'\\U0001f600'
\U0001f600

Stack Overflowの共同設立者であるJoel Spolskyによるこの短い記事をご覧になることをお勧めします 絶対に最小限のすべてのソフトウェア開発者は、ユニコードと文字セットについて絶対に肯定的に知っておく必要があります(言い訳はありません!)

14
PM 2Ring