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