파이썬 마을 게시판 인덱스 파이썬 마을
우리나라 파이썬 사용자들의 이야기 마을
 
 FAQFAQ   검색검색   멤버리스트멤버리스트   사용자 그룹사용자 그룹   사용자 등록하기사용자 등록하기 
 개인 정보개인 정보   비공개 메시지를 확인하려면 로그인하십시오비공개 메시지를 확인하려면 로그인하십시오   로그인로그인 
Google
python.or.kr Web

unicode 질문 입니다.

 
글 쓰기   답변 달기    파이썬 마을 게시판 인덱스 -> 파이썬 질문과 답변
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
i5on9i



가입:
올린 글: 12

올리기올려짐: 2006 11월 01 6:01 pm    주제: unicode 질문 입니다. 인용과 함께 답변

자꾸 질문만 해서 죄송한 느낌이네요..
근데 unicode를 다룰 수록 미로 속으로 가는 느낌이네요.

>>> u'위'
u'\xc0\xa7'
>>> type(u'위')
<type 'unicode'>

어디서 보니 u 는 Unicode string object 를 생성한다고 하네요.
근데,

>>> u'위'.encode('utf-8')
'\xc3\x80\xc2\xa7'

이 됩니다.

그럼 단순히 u'위' 를 했을 때는
실제로 unicode 의 값을 가지고 있지 않은 건가요?
그럼 굳이 u를 붙여서 가지고 있는 이유가 무엇인가요?

u'위' 에서 u를 붙이지 않고,
'위'.encode('utf-8')
을 하면

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc0 in position 0: ordinal not in range(128)

이런 에러가 발생하는 이유가 무엇이죠?
어차피 encode라면, 지금의 글자를 굳이 u로 해줄 필요가 있는 건가요???
아~ 뭔가 명확한 느낌이 안오네여~~ㅜ.ㅜ
아시면 좀 가르쳐 주세여~
위로
사용자 정보 보기 비밀 메시지 보내기    
장혜식
사이트 관리자


가입:
올린 글: 1374

올리기올려짐: 2006 11월 01 9:09 pm    주제: 인용과 함께 답변

일단 일반적으로 얘기하는 "유니코드"라는 말과, 파이썬에서의 "유니코드"는
약간 의미가 다릅니다. 일반적인 "유니코드"라는 말은 유니코드 컨소시엄에서
정의한 모든 캐릭터셋과 인코딩을 포함한 것 중 어느 일부라도 유니코드라고
부릅니다. 그렇지만, 파이썬의 "유니코드" 타입은 그냥 자료형의 일종으로써
다른 언어의 wide character string과 비슷한 개념입니다.

즉, "유니코드"타입이란, 문자를 연속적으로 담고 있는 자료형인데, 그 내부에
들어가는 원소들의 캐릭터셋이 유니코드 (파이썬에서는 디폴트로 UCS-2를
씁니다.)를 쓰는 것입니다. 즉, "유니코드"라는 타입은 통상적으로 말하는
UTF-8이나 UTF-16과는 직접적인 관련이 없습니다.

u'위'라고 했을 때 u'\xc0\xa7'이라고 나오는 것은 잘못 동작하는 것인데요,
어제 말씀드렸듯이, 인코딩을 latin1로 선언했을 때 cp949로 입력하면 나오는
현상입니다. IDLE에서는 지금 내부적인 버그로 인해 이런 일이 벌어지고
있습니다. 로켈이 제대로 세팅된 콘솔에서 stdout/stdin이 모두 터미널인 경우에는
문제 없이 로켈에 맞게 u'\uc704'로 나옵니다.

코드:
>>> u'위'
u'\uc704'


그리고 .encode('utf-8')을 하면 그때부터 파이썬쪽의 의미로써의 유니코드가
아닙니다. 단순 문자열이 되기 때문에 유니코드라고 부르지 않습니다.

코드:
>>> type(u'위'.encode('utf-8'))
<type 'str'>


그럼 뭐라고 부르냐.. 하면 "UTF-8로 인코드된 문자열" 이라고 부릅니다.

그리고, '위'.encode('utf-8')에서 에러가 나는 이유는 전에 다른 분들이 많이
질문을 하셨는데, 일단 유니코드 코덱들의 기본 동작은 이렇습니다.

encode: unicode -> str
decode: str -> unicode

따라서, encode를 하려면 우선 unicode로 변환한 다음에 이뤄져야합니다. 즉,

str -> unicode -> str

이렇게 되는데, 첫번째 str -> unicode 변환의 경우에는 인코딩이 명시적으로
지정된 것이 아니기 때문에 디폴트 인코딩인 ascii로 디코드를 하게 되고,
결국은 ascii 문자로 디코드 할 수 없는 것이라 에러가 나게 됩니다.

물론, 파이썬의 코덱 API는 조금 복잡해서, 유니코드와 관련이 없는 코덱 일부는
반드시 저런 식으로 동작하는 것은 아닙니다. (예를 들어 bz2, gzip, rot13 코덱)
그렇지만 유니코드 관련된 것은 모두 저런 식으로 둘러가기가 일어난다고
보시면 됩니다.
_________________
http://me2day.net/hyeshik
위로
사용자 정보 보기 비밀 메시지 보내기    
이전 글 표시:   
글 쓰기   답변 달기    파이썬 마을 게시판 인덱스 -> 파이썬 질문과 답변 시간대: GMT + 9 시간(한국)
페이지 11

 
건너뛰기:  
새로운 주제를 올릴 수 없습니다
답글을 올릴 수 없습니다
주제를 수정할 수 없습니다
올린 글을 삭제할 수 없습니다
투표를 할 수 없습니다



Powered by phpBB © 2001, 2005 phpBB Group
회선/장비: Daum DNA , 관리: 장혜식,서상현