|
Packit |
1470ea |
|
|
Packit |
1470ea |
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" xmlns:e="http://projectmallard.org/experimental/" type="guide" style="task" id="strings.py" xml:lang="ko">
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<info>
|
|
Packit |
1470ea |
<title type="text">Strings (Python)</title>
|
|
Packit |
1470ea |
<link type="guide" xref="beginner.py#theory"/>
|
|
Packit |
1470ea |
<link type="next" xref="label.py"/>
|
|
Packit |
1470ea |
<revision version="0.1" date="2012-06-16" status="draft"/>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<desc>파이썬과 GTK+에서 문자열을 다루는 방법을 설명합니다.</desc>
|
|
Packit |
1470ea |
<credit type="author copyright">
|
|
Packit |
1470ea |
<name>Sebastian Pölsterl</name>
|
|
Packit |
1470ea |
<email its:translate="no">sebp@k-d-w.org</email>
|
|
Packit |
1470ea |
<years>2011</years>
|
|
Packit |
1470ea |
</credit>
|
|
Packit |
1470ea |
<credit type="editor">
|
|
Packit |
1470ea |
<name>Marta Maria Casetti</name>
|
|
Packit |
1470ea |
<email its:translate="no">mmcasetti@gmail.com</email>
|
|
Packit |
1470ea |
<years>2012</years>
|
|
Packit |
1470ea |
</credit>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
|
|
Packit |
1470ea |
<mal:name>조성호</mal:name>
|
|
Packit |
1470ea |
<mal:email>shcho@gnome.org</mal:email>
|
|
Packit |
1470ea |
<mal:years>2017</mal:years>
|
|
Packit |
1470ea |
</mal:credit>
|
|
Packit |
1470ea |
</info>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<title>문자열</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<links type="section"/>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<note style="warning">그놈은 프로그램을 작성할 때 파이썬 3 활용을 강력하게 권장합니다! </note>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="python-2">
|
|
Packit |
1470ea |
<title>파이썬 2의 문자열</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
파이썬 2에서는 문자열을 표현하는 두가지 다른 객체 형식이 있는데 str 과 unicode 가 있습니다. unicode 인스턴스는 유니코드 문자열을 표현할 때 활용하며, str 형식은 인코딩한 문자열 바이트를 표현할 때 활용합니다. 내부적으로 파이썬에서는 파이썬 인터프리터를 어떻게 컴파일했느냐에 따라 유니코드 문자열을 16비트 내지는 32비트 정수로 표현합니다.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
>>> unicode_string = u"Fu\u00dfb\u00e4lle"
|
|
Packit |
1470ea |
>>> print unicode_string
|
|
Packit |
1470ea |
Fußbälle
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
유니코드 문자열은 unicode.encode() 로 8비트 문자열로 바꿀 수 있습니다. 파이썬의 8비트 문자열은 주어진 인코딩으로 문자열을 해석하는 str.decode() 메서드가 있습니다(그 말인 즉슨, unicode.encode() 의 반대 개념입니다):
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
>>> type(unicode_string)
|
|
Packit |
1470ea |
<type 'unicode'>
|
|
Packit |
1470ea |
>>> unicode_string.encode("utf-8")
|
|
Packit |
1470ea |
'Fu\xc3\x9fb\xc3\xa4lle'
|
|
Packit |
1470ea |
>>> utf8_string = unicode_string.encode("utf-8")
|
|
Packit |
1470ea |
>>> type(utf8_string)
|
|
Packit |
1470ea |
<type 'str'>
|
|
Packit |
1470ea |
>>> unicode_string == utf8_string.decode("utf-8")
|
|
Packit |
1470ea |
True
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
불행하게도 파이썬 2.x에서는 8비트 문자열에 7비트(아스키) 바이트가 들어가지만 ASCII 값이 아닌 경우 <sys>UnicodeDecodeError</sys>가 발생하므로, unicode 와 str 의 혼용을 허용하지 않습니다.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="python-3">
|
|
Packit |
1470ea |
<title>파이썬 3의 문자열</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Since Python 3.0, all strings are stored as Unicode in an instance of the str type. Encoded strings on the other hand are represented as binary data in the form of instances of the bytes type. Conceptually, str refers to text, whereas bytes refers to data. Use encode() to go from str to bytes , and decode() to go from bytes to str .
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
게다가, 더이상 유니코드 문자열과 인코딩 문자열을 혼용할 수 없는데, 결과적으로 TypeError 가 발생하기 때문입니다:
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
>>> text = "Fu\u00dfb\u00e4lle"
|
|
Packit |
1470ea |
>>> data = b" sind rund"
|
|
Packit |
1470ea |
>>> text + data
|
|
Packit |
1470ea |
Traceback (most recent call last):
|
|
Packit |
1470ea |
File "<stdin>", line 1, in <module>
|
|
Packit |
1470ea |
TypeError: Can't convert 'bytes' object to str implicitly
|
|
Packit |
1470ea |
>>> text + data.decode("utf-8")
|
|
Packit |
1470ea |
'Fußbälle sind rund'
|
|
Packit |
1470ea |
>>> text.encode("utf-8") + data
|
|
Packit |
1470ea |
b'Fu\xc3\x9fb\xc3\xa4lle sind rund'
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="gtk">
|
|
Packit |
1470ea |
<title>GTK+의 유니코드</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
GTK+에서는 UTF-8 인코딩 문자열을 모든 텍스트에 사용합니다. 무슨 이야기냐면, 문자열을 반환하는 메서드를 호출하면 str 형식 인스턴스를 받습니다. 하나 이상의 문자열을 받는 메서드에도 동일하게 적용하며, UTF-8로 인코딩해야합니다. 그러나 PyGObject에서는 인자에 데이터가 들어오면 어떤 유니코드 인스턴스든 문자열로 자동으로 바꿔줍니다:
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
>>> from gi.repository import Gtk
|
|
Packit |
1470ea |
>>> label = Gtk.Label()
|
|
Packit |
1470ea |
>>> unicode_string = u"Fu\u00dfb\u00e4lle"
|
|
Packit |
1470ea |
>>> label.set_text(unicode_string)
|
|
Packit |
1470ea |
>>> txt = label.get_text()
|
|
Packit |
1470ea |
>>> type(txt)
|
|
Packit |
1470ea |
<type 'str'>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
게다가:
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
>>> txt == unicode_string
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
는 False 값을 반환하며, __main__:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal (Gtk.Label.get_text() 는 항상 str 인스턴스를 내보내기 때문에, txt 와 unicode_string 은 다릅니다) 경고를 내보냅니다..
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<link href="http://docs.python.org/library/gettext.html">gettext </link>로 프로그램을 국제화할 경우 특히 더 중요합니다. gettext 에서 모든 언어에 대해 항상 UTF-8로 인코딩한 8비트 문자열을 반환하는지 확인하셔야합니다.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
일반적으로 GTK+ 프로그램 전체에서 unicode 객체를 안 쓰는게 좋으며, GTK+가 unicode 를 완전히 통합하지 않았기에, UTF-8로 인코딩한 str 객체만 씁니다.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
문자열 인코딩은 파이썬 3.x에서 좀 더 일관성이 있는데 PyGObject는 메서드로 문자열을 넘겨주거나 메서드에서 문자열을 반환할 때 자동으로 UTF-8로/부터 인코딩/디코딩을 처리합니다. 문자열, 텍스트는 항상 str 인스턴스로만 표현합니다.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="references">
|
|
Packit |
1470ea |
<title>참고 자료</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<link href="http://python-gtk-3-tutorial.readthedocs.org/en/latest/unicode.html">문자열 다루기 - Python GTK+ 3 따라하기 지침서</link>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
</page>
|