파이썬(Python) 한글 관련 질문이요

thisrule의 이미지

요즘 파이썬의 매력에 빠져있는 파이썬 초보입니다.
프로그래밍 환경은 우분투 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" 등으로 해봤는데도
결과는 같았습니다.

위 경험을 해보신분들의 도움 바랍니다.

andybear의 이미지

ubuntu의 한글코드 기본값이 utf-8이므로,
파이썬 코드를 편집할 때 첫째줄에
# -*- coding:utf-8 -*-
을 추가하시면 됩니다.

에러메시지에 있는 주소 (http://www.python.org/peps/pep-0263.html)로 들어가 보시면
설명되어 있습니다.

slomo의 이미지

파이썬 소스 파일에 코드 내이건 주석이건 한글을 써야 한다면
소스 파일의 인코딩을 지정해 주어야 합니다. 인코딩은 파일의
첫번째 또는 두번째 줄에 써줍니다.

제 경우에는 utf-8 으로 소스 파일을 저장하고 인코딩 지정
라인을 넣어줍니다. 한글 포함 스트링은 u를 붙여서 유니코드
문자열로 지정하고, 프린트하실 때는 콘솔창의 인코딩에 따라
encode() 해주어야 합니다. 예를 들면 다음처럼요. 그런데
정말 우분투를 쓰신다면 cp949 인코딩은 아닐텐데요...

#!/usr/bin/python
# -*- coding: utf-8 -*-
print u'안녕하세요'.encode('cp949')

그냥 print '안녕하세요'라고 해도 소스 파일 인코딩과 콘솔창의
인코딩이 동일할 경우에는 제대로 출력되는 것처럼 보입니다.
하지만 유니코드 문자열로 지정하지 않으면 스트링 함수를 사용했을 때
문제가 생깁니다. 예를들어, print len('안녕하세요')와
print len(u'안녕하세요')를 비교해 보세요.

유니코드 문자열을 많이 사용해서 매번 print할 때마다, 문자열마다
encode를 해주는 것이 불편할 때는 write() 메쏘드를 가진 클래스를
만들고 sys.stdout 을 이 클래스의 오브젝트로 대치하는 방식을
사용하면 편리합니다. 다음 예를 보세요.

#!/usr/bin/python
#-*- coding: utf-8 -*-
import sys
class Encode:
    def __init__(self, stdout, enc):
        self.stdout = stdout
        self.encoding = enc
    def write(self, s):
        self.stdout.write(s.encode(self.encoding))
 
sys.stdout = Encode(sys.stdout, 'cp949')
 
u = u'안녕하세요'
s = 'hello'
n = 124
print s, u, n

====
No one asks you for change or directions.
-- Slo-Mo, J. Krokidas

====
No one asks you for change or directions.
-- Slo-Mo, J. Krokidas

thisrule의 이미지

두분의 성의 있는 답변 모두 감사합니다.
덕분에 궁금증과 함께 모든게 다 해결됬습니다.

그런데 s = u'안녕하세요' 할때 u 글자는 없앨수 없나 보군요...
없으면 더 좋은텐데...

hongminhee의 이미지

Quote:
그런데 s = u'안녕하세요' 할때 u 글자는 없앨수 없나 보군요...
없으면 더 좋은텐데...

u'...'는 유니코드 문자열 리터럴이라는 뜻입니다.

winner의 이미지

Unicode가 기본입니다. 거꾸로 바이트 문자열을 쓰고 싶으면 b를 붙여야 하죠.

lazycoder의 이미지

문자열 앞에 u를 써준다고 항상 유니코드 문자열이 만들어지는건 아닌것 같습니다.

질문자와 동일한 2.5버전에서 테스트 하였습니다.

>>> import sys
>>> sys.getdefaultencoding()
'cp949'
>>> sys.stdin.encoding
'cp949'
>>> sys.stdout.encoding
'cp949'
>>> k = '안녕하세요'
>>> k
'\xbe\xc8\xb3\xe7\xc7\xcf\xbc\xbc\xbf\xe4'
>>> print _
안녕하세요
>>> uk = u'안녕하세요'
>>> uk
u'\uc548\ub155\ud558\uc138\uc694'
>>> print k[:2]
안
>>> print uk[:2]
안녕
>>> print len(k)
10
>>> print len(uk)
5
>>>

위 경우가 예상했던 결과라고 생각되지만.
ipython에선 결과가 다릅니다.

In [1]: import sys
 
In [2]: sys.getdefaultencoding()
Out[2]: 'cp949'
 
In [3]: sys.stdin.encoding
Out[3]: 'cp949'
 
In [4]: sys.stdout.encoding
Out[4]: 'cp949'
 
In [5]: k = '안녕하세요'
 
In [6]: k
Out[6]: '\xbe\xc8\xb3\xe7\xc7\xcf\xbc\xbc\xbf\xe4'
 
In [7]: print _
안녕하세요
 
In [8]: uk = u'안녕하세요'
 
In [9]: uk
Out[9]: u'\xbe\xc8\xb3\xe7\xc7\xcf\xbc\xbc\xbf\xe4'
 
In [10]: print k[:2]
안
 
In [11]: print uk[:2]
---------------------------------------------------------------------------
UnicodeEncodeError                        Traceback (most recent call last)
 
C:\Documents and Settings\Administrator\<ipython console> in <module>()
 
UnicodeEncodeError: 'cp949' codec can't encode character u'\xc8' in position 1:
illegal multibyte sequence
 
In [12]: print len(k)
10
 
In [13]: print len(uk)
10
 
In [14]:

문자열 앞에 u를 써줬지만 인코딩은 cp949입니다.

이건 왜이럴까요?

hongminhee의 이미지

유니코드는 인코딩되지 않은 문자열이라고 생각하시면 됩니다. 그러니까 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 -*-

추가하면 나오는듯

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.