Admin | Write | GuestBook
[공지] 해당 블로그에 용건이 있으신 분께서는 http://blog.fore.kr/ 의 방명록(Guestbook)으로 부탁드립니다.
[Python] 파이썬 2.7 유니코드 관계
Category : Programming/Programming Talk | URL : | Written by 포레 ( 2014. 12. 13. 01:44 ) | 신고

 

 

윈도우 프로그래밍에서 MultiByteToWideChar 혹은 WideCharToMultiByte 를 사용해본 분이라면

 

아마, 이해하기 쉬우실 듯 합니다.

 

인터넷에서 파이썬 유니코드 글들을 찾아보면 제일 큰 오해를 하고 있는것들이

 

' UTF-8 = 유니코드 '

 

로 이해하는 글들이 너무나 많다.

 

이게 틀린건 아닌데, 맞는거도 아니다. 정확힌 틀리다고 보는게 맞다.

 

문자 인코딩에는 크게 ANSI - 유니코드(UTF-16) - UTF-8 등이 존재한다.

( 즉, 유니코드와 UTF-8 은 별개의 문자열이다. )

정정 : 문자 인코딩에는 크게 ANSI, UTF-16, UTF-8 등이 존재한다.

이 중 UTF-16과 UTF-8 은 유니코드라는 범위에 속하며, 통상 UTF-16 을 유니코드라고 부른다.

 

자세한건 Wiki 참조.

유니코드 : http://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C

UTF-8 : http://ko.wikipedia.org/wiki/Utf-8

 

추측인데, 파이썬을 아무런 조작을 해두지 않은 상태라면 기본 ANSI로 실행되는 듯하다.

( 이 ANSI 라는게 반드시 한국어로 되라는 법은 없다. OS 언어 설정에 따라 이 ANSI 값은 바뀌게 된다. )

 

한가시 실험을 해보면 아래와 같다.

 

 

ascii = ANSI, utf-8, euc-kr 페이지는 따로 존재하는걸 볼 수 있다.

 

따라서, 기본 '유니코드' 로 코딩하는게 제일 안전하다는게 필자의 결론이다.

 

아래는 몇가지 예이다.

 

 

< 유니코드로 문자열로 저장시키기 >

 

>>> s = u'포레'

>>> print s

u'\uf7c6\ub9b7'

 

 

< ANSI를 유니코드로 변경 >

 

>>> s = '포레'

>>> s = s.decode('utf-16-le')

>>> print s

u'\uf7c6\ub9b7'

 ※ le는 little-endian, be는 big-endian 을 의미한다. 자세한 내용은 Wiki 참고.

http://ko.wikipedia.org/wiki/%EC%97%94%EB%94%94%EC%96%B8

 

 

< 유니코드 문자열을 유니코드 문자열로 파일 저장 >

 

>>> f = open(u'C:\\text_test.txt',u'w')

>>> s = u'포레'

>>> # 유니코드 텍스트 파일 시그니쳐

>>> f.write('\xff\xfe')

>>> # 버퍼를 저장.

>>> f.write(s.encode('utf-16-le'))

>>> f.close()

 

 

일반 함수에서 자연스럽게 유니코드 문자열을 넣으면 자동적으로 인식하는건

 

아마 PyObject 에 있는 구조체를 인식해서 그때그때 상황에 맞춰 함수 호출이 달라지는 듯 하다.

 

 

- 부록 -

 

# coding: (코드 페이지)
이녀석은 추측컨데, 해당 파이썬 스크립트를 (코드 페이지)로 인식시키는 듯하다.

 

# coding:utf-8 

# 이 밑으로 전부 utf-8 문자열로 컴파일링을 실시한다.

print '포레' .decode('utf-8').encode('euc-kr')

 

이녀석이 좀 많이 골치 아픈데, 위에 '포레' 라는 단어는 내부에서 바이트 그대로 읽어들여

 

포레 = 'ED 8F AC EB A0 88' 로 읽어들이게 된다. (utf-8)

 

이걸 그대로 사용하면 함수 등에 문제가 있으며

 

이걸 반드시 위와 같이 'ANSI'나 '유니코드' 로 바꿔줄 필요가 있다.

 

한가지 재미있는 예로 utf-16-le 코드 페이지로 설정하면 아래와 같이 된다.

 

py_codepage_utf16-le.py

 

메모장 등으로 열면 잘 안열리는데 아래와 같은 소스다.

 

#coding:utf-16-le (여기까지 ANSI)
( 이 밑부터 유니코드 페이지 속성으로 코딩 )

import sys
import msvcrt

 

 

print sys.getdefaultencoding()
print 'test'
print 'test'.decode(u'utf-16-le')
msvcrt.getch()

 

 

조잡하긴 한데, 열린다.

 

결과를 보면 test 부분은 하나씩 스페이스가 들어간 마냥 출력되는데

 

이는 't\x00e\x00s\x00t\x00' (ascii bytes) 으로 들어갔기 때문.

 

따라서, 위 코드를 쓸 때에는 조금 신경써서 코딩하는게 중요할 듯 하다.

 

 

setdefaultencoding (코드 페이지)

현재 실행되고 있는 파이썬 프로그램의 기본 언어 상태를 (코드 페이지)로 변경한다.

설명은 위와 비슷한듯 하지만, 전혀 다르다.

스크립트 자체 해석은 위에서 설명했던 코드 페이지에서 해석하는데

기본 시스템 언어로 설정된 함수에 한해서 setdefaultencoding 함수로 설정된 코드페이지에 맞춰

처리된다.

 

setdefaultencoding.py

 

위 파일 참고.

 

타언어 → 유니코드 → 텍스트 파일(euc-kr)로 저장.

( 예제는 일본어로 함. )

 

>>> f = open(u'ja.txt',u'r')

>>> b = f.read() 

>>> f.close()

>>> f = open(u'ko.txt','w')

>>> b = b.decode('shift-jis')

>>> # b 는 유니코드(utf-16-le) 상태

>>> b = b.encode('euc-kr')

>>> f.write(b)

>>> f.close()

 

언어별 인코딩 방식은

https://docs.python.org/2/library/codecs.html#standard-encodings

에서 확인할 수 있다.

 

 [ 테스트 파일 첨부 ]

ja.txt

 

결과가 あいうえお 로 나오면 정상적으로 처리됨.

 

생각컨데 여기까지 달리면 파이썬 유니코드 프로그래밍 하는건 크게 어렵지 않다고 본다.

 

 

'Programming > Programming Talk' 카테고리의 다른 글

[Python] pf2  (8) 2014.12.16
[C/C++] 한글 판별 코드.  (2) 2014.12.16
Thumbs.db 파일에 관한 고찰  (3) 2014.12.06
[Python] 동적 라이브러리(DLL) 사용 처리.  (0) 2014.12.03
[Python] 윈도우 다이어로그 생성  (0) 2014.12.02
Category
분류 전체보기 (605)
Notice (6)
Programming (79)
DISKER (1)
FSCH (7)
Caption (0)
Rest Time ! (443)
Hobby (64)
Tour (5)
Blind Post (0)
Recent Post
Recent Comment
Link
Calender
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Total :
Today :
Yesterday :