ホームページ > バックエンド開発 > Python チュートリアル > 絵文字エンコーディングを調べる

絵文字エンコーディングを調べる

Barbara Streisand
リリース: 2025-01-23 04:12:13
オリジナル
823 人が閲覧しました

絵文字エンコーディングの詳細: Unicode から UTF-8 バイトまで

絵文字を含む文字列をバイトに変換してみましたか?

<code class="language-python">text = 'Hi ??‍♂️'

print(bytes(text, 'utf-8'))</code>
ログイン後にコピー

出力結果:

<code>b'Hi \xf0\x9f\x99\x8b\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82\xef\xb8\x8f'</code>
ログイン後にコピー

これらの x が何なのか、またどのようにして絵文字に変換されるのか興味がありますか?

さらに詳しく調べると、1 つの絵文字を表現するには 5 つの Unicode 文字が必要であることがわかります。

<code class="language-python">emoji = '??‍♂️'
print("Length: ", len(emoji))
for c in emoji:
    code = ord(c)
    print("{}\t{}\t{}".format(code, hex(code), c))</code>
ログイン後にコピー

出力結果:

<code>Length:  5
128587  0x1f64b ?
127997  0x1f3fd ?
8205    0x200d  ‍
9794    0x2642  ♂
65039   0xfe0f  ️</code>
ログイン後にコピー

まず、基本的な絵文字があります: 手を上げている人? (128587 または 16 進数の 0x1f64b)。通常は U 1F64B として表されます。

次に、肌の色調修飾子: Light Skin Tone (127997) です。

これら 2 つを組み合わせると、この肌の色を持つジェンダーニュートラルな挙手の人物が得られます。

<code class="language-python">print(chr(128587) + chr(127997))</code>
ログイン後にコピー

出力結果:

<code>??</code>
ログイン後にコピー

最後から 2 番目の文字は男性記号を表し、最後の文字は Variant Selector-16 (VS16) と呼ばれ、前の文字が記号ではなく絵文字として表示されることを示します。

多くの文字を記号または絵文字として表示できます。

<code class="language-python">heart_symbol= '♥'
print(heart_symbol)
print(heart_symbol + chr(65039))</code>
ログイン後にコピー

出力結果:

<code>♥
♥️</code>
ログイン後にコピー

注: システムまたはレンダラーが絵文字をサポートしていない場合、シンボルとして表示される可能性があります。この場合、出力をコピーして別のテキスト エディターまたはブラウザーに貼り付けて、違いを確認します。

したがって、最初の 2 文字と最後の 2 文字は、2 つの別々の絵文字表現を表します。中央の文字はゼロ幅結合子 (ZWJ) と呼ばれ、2 つ以上の絵文字を結合するために使用されます。

<code class="language-python">woman = '?'
laptop = '?'
print(woman + chr(8205) + laptop)</code>
ログイン後にコピー

出力結果:

<code>?‍?</code>
ログイン後にコピー
ログイン後にコピー

もちろん、システムまたはフォントはこれらの組み合わせをサポートしている必要があります。サポートされていない場合は、別の文字としてレンダリングされるだけです。

<code class="language-python">man = '?'
toilet = '?'

print(man + chr(8205) + toilet)</code>
ログイン後にコピー

出力結果:

<code>?‍?</code>
ログイン後にコピー
ログイン後にコピー

ここで、各 Unicode 文字が一般的に UTF-8 エンコードでバイトとしてどのように表現されるかを見てみましょう。

キャラクター U 1F64B について考えてみましょう。

まず、文字の範囲に基づいて、それを保存するために必要なバイト数を決定する必要があります。数値自体をわずか 3 バイトに保存することはできますが、その場合、それを単一の文字にデコードする方法はありません。したがって、次のパターンが使用されます: (なぜこのパターンを使用するのですか?)

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

次に、数値 0x1f64b のビットをこのパターンに入れてみましょう。まずバイナリに変換します。

<code class="language-python">print(bin(0x1F64B))</code>
ログイン後にコピー

出力結果:

<code>0b11111011001001011</code>
ログイン後にコピー

パターンには 21 ビットがあるので、先頭に 0 を追加して一致させましょう:

000011111011001001011
000 011111 011001 001011

パターンに入力: 11110000 10011111 10011001 10001011

では、これらのバイトを 16 進数で表現するとどうなるでしょうか?

<code class="language-python">print(list(map(hex, [0b11110000, 0b10011111, 0b10011001, 0b10001011])))</code>
ログイン後にコピー

出力結果:

<code>['0xf0', '0x9f', '0x99', '0x8b']</code>
ログイン後にコピー

これらは、理解したい最初の 4 つの x と一致することに注意してください。これで、それらの意味がわかりました。

関連メモ: https://www.php.cn/link/0da44af358e8fcb6a6c2040602172d8d

Exploring emoji encodings

以上が絵文字エンコーディングを調べるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート