파이썬(Python) 한글 관련 질문이요
글쓴이: thisrule / 작성시간: 수, 2007/05/02 - 9:02오전
요즘 파이썬의 매력에 빠져있는 파이썬 초보입니다.
프로그래밍 환경은 우분투 feisty에서 python 2.5를 사용 중입니다.
그런데 파이썬 프로그램에 한글은 쓸수없나요?
프린트문이건, 주석문이건 한글만 있으면 오류가 납니다.
아래는 프린트문에 한글을 쓰면 발생하는 오류이구요
me@myhost$ cat hello.py print '안녕하세요' me@myhost$ python hello.py File "hello.py", line 1 SyntaxError: Non-ASCII character '\xbe' in file hello.py on line 1, but no encoding declared; see <a href="http://www.python.org/peps/pep-0263.html" rel="nofollow">http://www.python.org/peps/pep-0263.html</a> for details
아래는 한글만 있는 주석문을 실행한 결과입니다.
me@myhost$ cat hello2.py # 예제 프로그램입니다. me@myhost$ python hello2.py File "hello2.py", line 1 SyntaxError: Non-ASCII character '\xbf' in file hello2.py on line 1, but no encoding declared; see <a href="http://www.python.org/peps/pep-0263.html" rel="nofollow">http://www.python.org/peps/pep-0263.html</a> for details
인터넷에 뒤져보니 site.py에서 default encoding을 "cp949"로 바꾸면 된다고 했는데
그래도 결과는 같습니다. 그래서 default encoding을 "utf8", "euc-kr" 등으로 해봤는데도
결과는 같았습니다.
위 경험을 해보신분들의 도움 바랍니다.
Forums:
# -*- coding: <encoding name> -*- 을 추가해 보세요.
ubuntu의 한글코드 기본값이 utf-8이므로,
파이썬 코드를 편집할 때 첫째줄에
# -*- coding:utf-8 -*-
을 추가하시면 됩니다.
에러메시지에 있는 주소 (http://www.python.org/peps/pep-0263.html)로 들어가 보시면
설명되어 있습니다.
파이썬 소스 파일에
파이썬 소스 파일에 코드 내이건 주석이건 한글을 써야 한다면
소스 파일의 인코딩을 지정해 주어야 합니다. 인코딩은 파일의
첫번째 또는 두번째 줄에 써줍니다.
제 경우에는 utf-8 으로 소스 파일을 저장하고 인코딩 지정
라인을 넣어줍니다. 한글 포함 스트링은 u를 붙여서 유니코드
문자열로 지정하고, 프린트하실 때는 콘솔창의 인코딩에 따라
encode() 해주어야 합니다. 예를 들면 다음처럼요. 그런데
정말 우분투를 쓰신다면 cp949 인코딩은 아닐텐데요...
그냥 print '안녕하세요'라고 해도 소스 파일 인코딩과 콘솔창의
인코딩이 동일할 경우에는 제대로 출력되는 것처럼 보입니다.
하지만 유니코드 문자열로 지정하지 않으면 스트링 함수를 사용했을 때
문제가 생깁니다. 예를들어, print len('안녕하세요')와
print len(u'안녕하세요')를 비교해 보세요.
유니코드 문자열을 많이 사용해서 매번 print할 때마다, 문자열마다
encode를 해주는 것이 불편할 때는 write() 메쏘드를 가진 클래스를
만들고 sys.stdout 을 이 클래스의 오브젝트로 대치하는 방식을
사용하면 편리합니다. 다음 예를 보세요.
====
No one asks you for change or directions.
-- Slo-Mo, J. Krokidas
====
No one asks you for change or directions.
-- Slo-Mo, J. Krokidas
감사합니다.
두분의 성의 있는 답변 모두 감사합니다.
덕분에 궁금증과 함께 모든게 다 해결됬습니다.
그런데 s = u'안녕하세요' 할때 u 글자는 없앨수 없나 보군요...
없으면 더 좋은텐데...
인용: 그런데 s =
u'...'는 유니코드 문자열 리터럴이라는 뜻입니다.
Python 3 쓰세요.
Unicode가 기본입니다. 거꾸로 바이트 문자열을 쓰고 싶으면 b를 붙여야 하죠.
문자열 앞에 u를
문자열 앞에 u를 써준다고 항상 유니코드 문자열이 만들어지는건 아닌것 같습니다.
질문자와 동일한 2.5버전에서 테스트 하였습니다.
위 경우가 예상했던 결과라고 생각되지만.
ipython에선 결과가 다릅니다.
문자열 앞에 u를 써줬지만 인코딩은 cp949입니다.
이건 왜이럴까요?
유니코드는
유니코드는 인코딩되지 않은 문자열이라고 생각하시면 됩니다. 그러니까
uk
가 CP949로 인코딩된 바이트열은 아닙니다. 다만 출력할 때는 바이트열로 인코딩해서 표준 출력에 뿌려야 하기 때문에, 현재의 Python 기본 인코딩(sys.getdefaultencoding()
)에 따라uk
를 CP949로 인코딩하려다 실패해서 나는 에러입니다.기본적으로 ipython의 유니코드 입력에 문제가 있는 것 같군요.
u'안녕하세요'
라고 입력했다면 (현재 터미널에서 사용하는 인코딩과 Python 기본 인코딩이 일치하도록 잘 설정되어있다는 가정 하에)u'\xbe\xc8\xb3\xe7\xc7\xcf\xbc\xbc\xbf\xe4'
가 아니라u'\uc548\ub155\ud558\uc138\uc694'
라고 되어야 합니다.—홍민희 (VLAAH, LangDev)
나그네
# -*- coding: euc-kr -*-
추가하면 나오는듯
댓글 달기