2012-10-26 3 views
4

사용자에게 뭔가를 출력해야 할 때 유니 코드와 인코딩을 UTF-8로 처리했다는 것을 알면서 파이썬 세계에 만족했습니다. 그런 다음 동료 중 한 명이 나를 this article으로 UTF-8로 보냈고 혼란스러워했습니다.유니 코드는 Python으로 - 단지 UTF-16입니까?

이 기사의 저자는 Python이 사용하는 유니 코드 표현 인 UCS-2가 UTF-16과 동의어임을 여러 번 나타냅니다. 그는 심지어 Python이 내부 문자열 표현을 위해 UTF-16을 사용한다고 직접 말합니다.

저자는 또한 Windows 애호가 및 개발자임을 인정하고 MS가 수년 동안 문자 인코딩을 처리 한 방식으로 인해 그 그룹이 가장 혼란스러워지기 때문에 아마도 그 자신의 혼란 일 수 있습니다. 나는 모른다 ...

누군가는 UTF-16 대 유니 코드의 상태를 파이썬으로 설명 할 수 있습니까? 그것들은 동의어입니까, 그렇지 않다면 어떤 의미입니까?

+1

왜 파이썬의 _internal_ 문자열 표현에 관심이 있습니까? 이 사이트의 요점은 개발자가 작성한 모든 코드에서 UTF-8을 사용하도록 설득하는 것입니다. 파이썬 내부를 개발하지 않는 것입니까? –

+0

UCS-2 및 UTF-16 *은 같지 않습니다 *. UCS-2는 모든 유니 코드 코드 포인트를 인코딩하지 않으므로 폐기되었습니다. –

+1

@MattBall SO는 지식을 공유하고 (서로를 돕는) 개발자에 관한 것입니다. 이것은 저에게 흥미로운 것입니다. 이 질문을하는 데 더 이상의 이유가 필요합니까? – Endophage

답변

19

파이썬 유니 코드 문자열 (3.2에서 2.2 버전)의 내부 표현 파이썬 는 넓은 또는 좁은 모드에서 컴파일되었는지 여부에 의존한다. 대부분의 Python 빌드는 좁습니다 (sys.maxunicode으로 확인할 수 있습니다 - 좁은 빌드에서는 65535이고 넓은 빌드에서는 1114111입니다).

넓은 빌드의 경우 문자열은 내부적으로 4 바이트 크기의 문자로 이루어지며 즉 UTF-32 인코딩을 사용합니다. 모든 코드 포인트는 길이가 정확히 하나의 와이드 문자입니다.

좁은 빌드의 경우 문자열은 UTF-16을 사용하여 내부적으로 2 바이트 너비 문자 시퀀스입니다. BMP 영역 (코드 포인트 이상 U + 10000)을 넘어 문자는 보통 UTF-16 서로 게이트 쌍을 사용하여 저장됩니다 : UTF-16, UCS-2가 동일하지 않은 것을

>>> q = u'\U00010000' 
>>> len(q) 
2 
>>> q[0] 
u'\ud800' 
>>> q[1] 
u'\udc00' 
>>> q 
u'\U00010000' 

참고. UCS-2는 고정 폭 인코딩입니다. 모든 코드 포인트는 2 바이트로 인코딩됩니다. 결과적으로 UCS-2 은 BMP를 넘어 코드 포인트를 인코딩 할 수 없습니다. UTF-16은 가변 폭 인코딩입니다. BMP 외부의 코드 포인트는 서로 게이트 쌍 (surrogate pair)이라고하는 한 쌍의 문자를 사용하여 인코딩됩니다.


이 모든 변경 사항은 3.3에서 구현되며 PEP 393입니다. 이제 유니 코드 문자열은 ASCII 문자열의 경우 8 비트, BMP 문자열의 경우 16 비트 및 그렇지 않은 경우 32 비트로 최대 코드 포인트를 보유 할만큼 충분히 넓은 문자를 사용하여 표현됩니다. 이것은 wide/narrow 나눗셈을 제거하고 많은 ASCII 전용 문자열이 사용될 때 메모리 사용을 줄이는 데에도 도움이됩니다.

+4

3.3에서는 각 문자의 크기가 문자열의 가장 큰 코드 점에 의해 결정되는보다 유연한 체계를 도입했습니다. ASCII 문자열은 문자 당 8 비트이고 더 넓은/좁은 모드는 없습니다. –

+0

감사합니다. 나는이 세부 사항을 포함 할 나의 대답을 수정했다. (나는 당신이 코멘트를 게시 할 때 관련 PEP를 읽었습니다. :) – nneonneo

+0

그래서 나는 당신을 올바르게 이해하고 있으며, 그것은 실제로 내부적으로 하이브리드 표현입니다. UTF-2는 BMP를 덮고 UTF-16은 그 이상입니다. 그러나 파이썬은 여전히 ​​그것을 "유니 코드"라고 부릅니다. 예? – Endophage