Blame platform-demos/ko/strings.py.page

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에서는 문자열을 표현하는 두가지 다른 객체 형식이 있는데 strunicode가 있습니다. 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>가 발생하므로, unicodestr 의 혼용을 허용하지 않습니다.

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 인스턴스를 내보내기 때문에, txtunicode_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>