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

이모티콘 인코딩 탐색

Jan 23, 2025 am 04:12 AM

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

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

text = 'Hi ??‍♂️'

print(bytes(text, 'utf-8'))
로그인 후 복사

출력 결과:

<code>b'Hi \xf0\x9f\x99\x8b\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82\xef\xb8\x8f'</code>
로그인 후 복사

x가 무엇인지, 어떻게 이모티콘으로 다시 변환되는지 궁금하시나요?

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

emoji = '??‍♂️'
print("Length: ", len(emoji))
for c in emoji:
    code = ord(c)
    print("{}\t{}\t{}".format(code, hex(code), c))
로그인 후 복사

출력 결과:

<code>Length:  5
128587  0x1f64b ?
127997  0x1f3fd ?
8205    0x200d  ‍
9794    0x2642  ♂
65039   0xfe0f  ️</code>
로그인 후 복사

먼저 기본 이모티콘이 있습니다. 손을 들고 있는 사람(128587 또는 16진수로 0x1f64b), 일반적으로 U 1F64B로 표시됩니다.

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

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

print(chr(128587) + chr(127997))
로그인 후 복사

출력 결과:

<code>??</code>
로그인 후 복사

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

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

heart_symbol= '♥'
print(heart_symbol)
print(heart_symbol + chr(65039))
로그인 후 복사

출력 결과:

<code>♥
♥️</code>
로그인 후 복사

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

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

woman = '?'
laptop = '?'
print(woman + chr(8205) + laptop)
로그인 후 복사

출력 결과:

<code>?‍?</code>
로그인 후 복사
로그인 후 복사

물론 시스템이나 글꼴이 이러한 조합을 지원해야 합니다. 그렇지 않으면 별도의 문자로 렌더링됩니다.

man = '?'
toilet = '?'

print(man + chr(8205) + toilet)
로그인 후 복사

출력 결과:

<code>?‍?</code>
로그인 후 복사
로그인 후 복사

이제 일반적으로 UTF-8 인코딩에서 각 유니코드 문자가 어떻게 바이트로 표시되는지 살펴보겠습니다.

U 1F64B라는 캐릭터를 생각해 봅시다.

먼저 문자 범위에 따라 저장하는 데 필요한 바이트 수를 결정해야 합니다. 숫자 자체를 단 3바이트로 저장할 수 있지만 다시 단일 문자로 디코딩할 수 있는 방법은 없습니다. 따라서 다음 패턴이 사용됩니다. (이 패턴을 사용하는 이유는 무엇입니까?)

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

이제 이 패턴에 숫자 0x1f64b의 비트를 넣어보겠습니다. 먼저 바이너리로 변환합니다.

print(bin(0x1F64B))
로그인 후 복사

출력 결과:

<code>0b11111011001001011</code>
로그인 후 복사

패턴은 21비트이므로 일치하도록 시작 부분에 0을 추가하겠습니다.

000011111011001001011
000 011111 011001 001011

패턴에 넣기: 11110000 10011111 10011001 10001011

이제 이 바이트의 16진수 표현은 무엇입니까?

print(list(map(hex, [0b11110000, 0b10011111, 0b10011001, 0b10001011])))
로그인 후 복사

출력 결과:

<code>['0xf0', '0x9f', '0x99', '0x8b']</code>
로그인 후 복사

이는 우리가 이해하고 싶은 처음 4개x와 일치합니다. 이제 당신은 그것이 무엇을 의미하는지 알게 되었습니다.

관련 참고 사항: https://www.php.cn/link/0da44af358e8fcb6a6c2040602172d8d

Exploring emoji encodings

위 내용은 이모티콘 인코딩 탐색의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

HTML을 구문 분석하기 위해 아름다운 수프를 어떻게 사용합니까? HTML을 구문 분석하기 위해 아름다운 수프를 어떻게 사용합니까? Mar 10, 2025 pm 06:54 PM

HTML을 구문 분석하기 위해 아름다운 수프를 어떻게 사용합니까?

파이썬의 이미지 필터링 파이썬의 이미지 필터링 Mar 03, 2025 am 09:44 AM

파이썬의 이미지 필터링

Python을 사용하여 텍스트 파일의 ZIPF 배포를 찾는 방법 Python을 사용하여 텍스트 파일의 ZIPF 배포를 찾는 방법 Mar 05, 2025 am 09:58 AM

Python을 사용하여 텍스트 파일의 ZIPF 배포를 찾는 방법

Python을 사용하여 PDF 문서를 사용하는 방법 Python을 사용하여 PDF 문서를 사용하는 방법 Mar 02, 2025 am 09:54 AM

Python을 사용하여 PDF 문서를 사용하는 방법

Django 응용 프로그램에서 Redis를 사용하여 캐시하는 방법 Django 응용 프로그램에서 Redis를 사용하여 캐시하는 방법 Mar 02, 2025 am 10:10 AM

Django 응용 프로그램에서 Redis를 사용하여 캐시하는 방법

Tensorflow 또는 Pytorch로 딥 러닝을 수행하는 방법은 무엇입니까? Tensorflow 또는 Pytorch로 딥 러닝을 수행하는 방법은 무엇입니까? Mar 10, 2025 pm 06:52 PM

Tensorflow 또는 Pytorch로 딥 러닝을 수행하는 방법은 무엇입니까?

파이썬 객체의 직렬화 및 사제화 : 1 부 파이썬 객체의 직렬화 및 사제화 : 1 부 Mar 08, 2025 am 09:39 AM

파이썬 객체의 직렬화 및 사제화 : 1 부

파이썬에서 자신의 데이터 구조를 구현하는 방법 파이썬에서 자신의 데이터 구조를 구현하는 방법 Mar 03, 2025 am 09:28 AM

파이썬에서 자신의 데이터 구조를 구현하는 방법

See all articles