2008-08-22 3 views
28

는 내가 Django tutorial에서이 구절을 통해 발견 :유니 코드 대 Python/Django에서의 UTF-8 혼란?

장고 모델 유니 코드()를 호출하고 UTF-8 bytestring에 결과를 변환하는 기본 STR() 메소드가 있습니다. 이것은 유니 코드 (p)가 유니 코드 문자열을 반환하고 str (p)가 UTF-8로 인코딩 된 문자로 일반 문자열을 반환한다는 것을 의미합니다.

afaik 유니 코드가 특별한 표현이 아니기 때문에 혼란 스럽습니다. 파이썬에서 "유니 코드 문자열"은 무엇입니까? 그것은 UCS-2를 의미합니까? 인터넷 검색 결과는 this "Python Unicode Tutorial"으로 대담하게 나타납니다.

유니 코드는 세계 공통의 모든 문자 체계를 포괄하는 2 바이트 인코딩입니다.

틀린가요? 나는 문자 집합과 인코딩 문제로 여러 번 혼란 스러웠다. 그러나 여기서 내가 읽는 문서는 혼란 스럽다. 파이썬에서 나에게 "유니 코드 문자열"을 주었을 때 무슨 일이 벌어지고 있는지 아는 사람이 있습니까?

답변

47

파이썬에서 "유니 코드 문자열"이란 무엇입니까? 그것은 UCS-2를 의미합니까?

파이썬의 유니 코드 문자열은 내부적으로 UCS-2 (고정 길이 16 비트 표현, 거의 UTF-16과 동일) 또는 UCS-4/UTF-32 (고정 길이 32 비트 대표). 컴파일 타임 옵션입니다. Windows에서는 항상 UTF-16이지만 많은 Linux 배포판에서는 파이썬 버전에 대해 UTF-32 ('와이드 모드')를 설정합니다.

일반적으로 유니 코드 코드 포인트가 문자열의 단일 요소로 표시되어 2 바이트 또는 4 바이트로 저장되는지 여부를 알 수 없습니다. UTF-16 빌드를 사용하고 있고 Basic Multilingual Plane 외부의 문자를 처리해야하는 경우 잘못된 일을하게 될 것입니다.하지만 여전히 매우 드문 경우이며 추가 문자가 필요한 사용자는 넓은 빌드를 컴파일해야합니다.

틀린가요?

예, 상당히 잘못되었습니다. 공정하기 위해서는 튜토리얼은 다소 오래되었다고 생각합니다. Unicode 3.1 (기본 다국어 평면 밖에서 문자를 도입 한 버전)이 아닌 경우 와이드 유니 코드 문자열보다 우선합니다.

NT가 내부적으로 사용하는 UTF-16LE 인코딩을 의미하기 위해 "유니 코드"라는 용어를 사용하는 Windows의 습관 때문에 발생하는 추가 혼동의 원인이 있습니다. Microsoftland의 사람들은 오해의 소지가있는이 습관을 종종 복사 할 수 있습니다.

+1

다른 사람이 선택한 "답변"이 선택된 경우에도 사람들이이 답변에 투표하십시오. – tzot

+0

[부끄러움] 둘 다 정확합니다. 'len ('ΤΖΩΤΖΙΟΥ ') == 8'의 의미는 유니 코드 문자열이 실제로 무엇인지 정의합니다. – bobince

+2

나는 동의하지 않는다; 질문을 읽고, "파이썬에서 유니 코드 문자열이란 무엇입니까?"라고 말합니다. 선택한 대답은 무작위로 문장의 메쉬처럼 보이지만 대답은 훨씬 더 중요해 보입니다. 그러나 이것은 더 이상 추구하지 않을 문제입니다. 건배 :) – tzot

0

파이썬은 유니 코드를 UTF-16으로 저장합니다. str()은 UTF-16 문자열의 UTF-8 표현을 반환합니다. Wikipedia on UTF-8 가입일

+1

파이썬은 플랫폼 및 컴파일 옵션에 따라 유니 코드 문자열을 UTF-16 또는 UTF-32로 저장합니다. – tzot

+0

str (unicode_string)이 UTF-8을 반환하는 플랫폼은 무엇입니까? 너 해봤 니? 예 : str (u "\ u0369") – tzot

+2

두 가지 모두에서 잘못되었습니다. 'str (unicode_val)'은'sys.getdefaultencoding()'에 따라 인코딩됩니다. – Tobu

-1

:

UTF-8 (8 비트 UCS/유니 변환 형식)를위한 유니 가변 길이 문자 인코딩이다. 유니 코드 표준의 모든 문자를 나타낼 수 있지만 UTF-8의 바이트 코드 및 문자 할당의 초기 인코딩은 ASCII와 역 호환됩니다. 이러한 이유 때문에 꾸준히 전자 메일, 웹 페이지 [1] 및 문자가 저장되거나 스트리밍되는 다른 장소에 선호되는 인코딩이되고 있습니다.

그래서 유니 코드 영역에서 어떤 문자를 나타낼 지에 따라 1 바이트에서 4 바이트 사이입니다. 컴퓨팅에서

From Wikipedia on Unicode:

는 유니 코드는 컴퓨터가 일관되게 표현하고 텍스트 에서 세계 기록 시스템의 대부분을 표현 조작 할 수 있도록 업계 표준입니다.

그래서 전 세계 작성 시스템의 대부분 (전부는 아님)을 나타낼 수 있습니다. 나는이 희망

는 :

-2

그렇게 파이썬에서 "유니 코드 문자열"무엇을하는 데 도움이?

파이썬은 문자열이 유니 코드임을 '알고 있습니다'. 그러므로 당신이 그것에 정규식을한다면 그것은 정말로 어떤 것이고 어떤 것이 아닌지를 알게 될 것이고 이것은 실제로 도움이됩니다. 당신이 strlen을했다면 올바른 결과를 줄 것입니다. 예를 들어 Hello에서 문자열 수를 계산 한 경우 유니 코드 인 경우에도 5가됩니다. 그러나 당신이 외국어의 문자열 카운트를했고 그 문자열이 유니 코드 문자열이 아니라면 훨씬 더 큰 결과를 얻을 것입니다. Pythong은 유니 코드 문자열 정보를 사용하여 유니 코드 문자열의 각 문자를 식별합니다.희망이 도움이됩니다.

8

한편, 나는 파이썬의 내부 표현이 무엇인지, 그리고 그 한계가 무엇인지 확인하기위한 세련된 연구를 수행했다. "The Truth About Unicode In Python"은 Python 개발자가 직접 인용 한 아주 좋은 기사입니다. 외관상으로는 컴파일 시간 스위치에 따라 내부 표현이 UCS-2 또는 UCS-4입니다. Jon은 UTF-16이 아니지만 어쨌든 답장을 보내 주시면 감사하겠습니다.

관련 문제