рассказываю всё попорядку:
Глава 1. введение::
из чтения документаций — заметил что в Gtk-фреймворке в принцепе в основном используются байтовые строки (а не Unicode-строки)
....однако Unicode`ные строки тоже хорошо работают... (все Gtk-функции их свободно «понимают» )
тоесть оба варианта работают и официально щитаются корректными:
my_text_entry_1.set_text( b'байтовая строка' )
my_text_entry_2.set_text( u'юникодная строка' )
однако можно делать даже так (!):
# даже в случае не-ascii символов в GTK-строке -- свободно извлекается юникодный объект:
unistr = unicode(my_text_entry.get_text()) # хотя ОБЫЧНО -- в Python-2 (в отличии от Python-3) это делать нельзя,
# без явного указания кодировки. (например xxxx.decode('UTF-8') )
и праграммист должен ТОЧНО (на 100%) ЗНАТЬ — какая конкретно кодировка имеется ввиду.
например для кодирования НАЗВАНИЯ файлов используется одна кодировка, а для кодированиях СОДЕРЖАНИЯ файлов — другая кодировка . для кодирования символов ТЕРМИНАЛА используется третья кодировка .. вобщем — для каждой сущности в операционной системе — как правило существует своя кодировка... некоторые кодировки в различных операционных системах повторяются (например кодировка не-юникодного GUI в Windows совпадает с кодировкой содержимого текстовых файлов (но эта кодировка отличается от кодировки имён файлов и кодировки терминала) .. в других операционных системах схожести и различия могут быть другие...
...так-что каждый программист который пишет кросплатформенную программу должен везде (для каждой сущности) — использовать специальную кодировку название которой — извлекается через ту-или-иную _соответствующщую_ спец-функцию (а не вбивается через исходный код) .
[[[[ вобщем головная боль с названиями кодировок :-) . можно сделать баг и никогда в жизне его не заметить, так как проявлятсья он будет на фиг пойми какой операционной системе, в фиг-пойми какой языковой группе ]]]]
но если GTK не требует указывать кодировку для своих Виджетов при оперировании Юникодными объектами — то значит с программиста сподает очередная головная боль .. программисту не придётся задумываться над вопросом: «а верно ли я понимаю какую я должен использовать кодировку для GTK-виджетов»
Глава 3. необычность выходит за рамки Gtk::
оказывается что в Gtk программах рабтает даже ЭТО(!!!):
unistr = u'внутри юникодной строки -- %s . вот так-то!' % b'байтовая строка'
btstr = b'внутри байтовой строки -- %s . вот так-то!' % u'юникодная строка'
# привет миру Python-3 -- где такое возможно "из-коробки" :-) , для любых программ
Глава 4. а вот тут — хак таки-пойман с поличным::
простая Пайтон-программа из четырйх строчек:
import sys
print sys.getdefaultencoding() # печатает: ascii
import gtk
print sys.getdefaultencoding() # печатает: utf-8
вот оказывается почему (изза этого хака) — так свободно PyGTK оперирует с Юникодными-строками... тоест ьпо сути поддержки юникодных строк в PyGTK — нет :-( :-(
[и вместо того чтобы переписать все PyGTK-функции из Байтовых-строк на Юникодные-строки, разработчики решили просто сделать — ЭТО]
Глава 5. эпилог::
что думаете про всё это? :-)
***
и вот ещё вопрос — как они реализовали этот «хак» ? ведь функция sys.setdefaultencoding(...) [ http://j.mp/92lnL6 ] — не работает %) %)
былобы полезно заюзать этот хак и не в GTK-программах :-)
(GTK не изменяет указатель на функцию sys.getdefaultencoding .. — это проверял )
Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> enc = sys.getdefaultencoding
>>> enc()
'ascii'
>>> import gtk
>>> enc()
'utf-8'
>>>