>백엔드 개발 >파이썬 튜토리얼 >이모티콘 인코딩 탐색

이모티콘 인코딩 탐색

Barbara Streisand
Barbara Streisand원래의
2025-01-23 04:12:13783검색

Emoji 인코딩에 대한 심층 분석: 유니코드에서 UTF-8 바이트까지

Emoji가 포함된 문자열을 바이트로 변환해 보셨나요?

<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가 무엇인지, 어떻게 이모티콘으로 다시 변환되는지 궁금하시나요?

더 자세히 살펴보면 단일 Emoji를 표현하려면 5개의 유니코드 문자가 필요하다는 것을 알 수 있습니다.

<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로 표시됩니다.

그리고 피부색 수정자는 밝은 피부색(127997)입니다.

이 두 가지를 결합하면 이 피부색을 지닌 성별 중립적인 손을 든 사람이 탄생합니다.

<code class="language-python">print(chr(128587) + chr(127997))</code>

출력 결과:

<code>??</code>

끝에서 두 번째 문자는 남성 기호를 나타내고, 마지막 문자는 Variant Selector-16(VS16)이라고 하는데, 이는 이전 문자가 기호가 아닌 이모티콘으로 표시되어야 함을 나타냅니다.

많은 문자가 기호나 이모티콘으로 표시될 수 있습니다.

<code class="language-python">heart_symbol= '♥'
print(heart_symbol)
print(heart_symbol + chr(65039))</code>

출력 결과:

<code>♥
♥️</code>

참고: 시스템이나 렌더러가 이모티콘을 지원하지 않으면 기호로 렌더링될 수 있습니다. 이 경우 출력을 복사하여 다른 텍스트 편집기나 브라우저에 붙여넣어 차이점을 확인하세요.

따라서 처음 두 글자와 마지막 두 글자는 두 개의 개별 이모티콘 표현을 나타냅니다. 가운데 문자는 ZWJ(Zero-Width Joiner)라고 하며 두 개 이상의 이모티콘을 결합하는 데 사용됩니다.

<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>

이제 일반적으로 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.