Найти - Пользователи
Полная версия: Gtk + Utf8 + Unicode <- живут в дружбе и мире благодаря грязному Хаку?
Начало » GUI » Gtk + Utf8 + Unicode <- живут в дружбе и мире благодаря грязному Хаку?
1
tmp_a6367100
сенсация: :-D :-D Gtk + Utf8 + Unicode <- живут в дружбе и мире благодаря грязному Хаку?

рассказываю всё попорядку:

1. введение::

заметил что в Gtk-фреймворке в принцепе в основном используются байтовые строки (а не Unicode-строки)

….однако Unicode`ные строки тоже хорошо работают… (все Gtk-функции их свободно “понимают” )

тоесть оба варианта работают и официально щитаются корректными:
my_text_entry_1.set_text(  b'байтовая строка'  )
my_text_entry_2.set_text( u'юникодная строка' )
2. слегка необычное удобство::

однако можно делать даже так (!):
# даже в случае не-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 -- где такое возможно "из-коробки" :-) , для любых программ
так-так…. попахивает грязным хаком, который исправляет поведение целого Пайтона при использовании GTK

4. а вот тут – хак таки-пойман с поличным::

простая Пайтон-программа из четырйх строчек:

import sys
print sys.getdefaultencoding() # печатает: ascii
import gtk
print sys.getdefaultencoding() # печатает: utf-8
вот почему (изза этого хака) – так свободно PyGTK оперирует с Юникодными-строками… тоест ьпо сути поддержки юникодных строк в PyGTK – нет :-( :-(



5. эпилог::

что думаете про всё это?
tmp_a6367100
и вот ещё вопрос – как они реализовали этот “хак” ? ведь функция sys.setdefaultencoding(…) – не работает %) %)

былобы полезно заюзать этот хак и не в GTK-программах :-)

(GTK не изменяет указатель на функцию sys.getdefaultencoding .. – это проверял )
tmp_a6367100
tmp_a6367100
(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'
>>>
tmp_a6367100
а вот в PySide – всё работает ЧЕСТНО на Юникодных объектах :-) :-)

….. .. но правда не совсем всё…
кой какие функции там через байтовые-строки сделаны:
вот например: PySide.QtUiTools.QUiLoader.load(path_as_bytes_str)
(хотя выглядет это больше как BUG , так как остальные функции внутри PySide.QtUiTools.QUiLoader опятьже-таки на Юникоде %) %) )
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB