GTK2 и WideString

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

GTK2 и WideString

Сообщение Flanter » 03.11.2007 22:24:36

Подскажите, пожалуйста, как правильно передавать строки WideString в GTK2? Насколько я понимаю, тип Pgchar в GTK - это UTF-8. Соответственно я пробую конструкцию вроде следующей:

Код: Выделить всё
var
  G: Pgchar;
  ...
  G := Pgchar(UTF8Encode('Test Тест'));
  gtk_window_set_title(PGtkWindow(FWindow), G);


Заголовок окна отображается нормально. Но стоит в текст заголовка ввести какой-нибудь некириллический Unicode-символ (например, Œ или китайский иероглиф), как заголовок окна вообще перестаёт отображаться. Наверное, я где-то туплю и что-то неправильно делаю в приведенном выше коде? Подскажите, пожалуйста...

P.S. Исходные тексты редактируются в кодировке UTF-8, при компиляции указывается ключ -Fcutf8.
Flanter
новенький
 
Сообщения: 42
Зарегистрирован: 03.11.2007 22:15:54

Сообщение alexs » 04.11.2007 00:24:54

А где ты это символ ставиш? и вобще в какой кодировке пишеш сам исходник? Попробуй его прибавить за пределами функции UTF8Encode - ну это если символ уже в кодировке utf8
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Flanter » 04.11.2007 08:34:37

Кодировка исходника UTF-8, так что с этой стороны проблем вроде бы быть не должно. А вот пример - да, неудачный я привёл, т.к. не видно где тут WideString. Реально там вот такой код:

Код: Выделить всё
procedure TWindow.SetText(Value: WideString);
begin
  gtk_window_set_title(PGtkWindow(FWindow), Pgchar(UTF8Encode(Value)));
end;

Window.SetText('Тест Œ');


Если функцию UTF8Encode исключить, то вместо одного нужного символа выводятся два левых (например, вместо Œ выводится R и квадратик). Что логично, т.к. WideString, насколько я понимаю, это UCS-2...

Пробовал также такой вариант:

Код: Выделить всё
Window.SetText('Тест ' + #338);


Результат аналогичный - заголовок не выводится вообще. И даже вот так пробовал:

Код: Выделить всё
var
  W: WideString;
  ...
  W := 'Тест ' + #338;
  Window.SetText(W);


То же самое. Когда аналогичный заголовок делаю в win32api-коде - заголовок выводится правильный. Да, забыл написать, что все эксперименты проводятся c Windows-версией GTK, а не в Linux'е.

Может, есть какие-то тонкости работы с юникодом в GTK? Может, я чего-то где-то не учитываю...
Flanter
новенький
 
Сообщения: 42
Зарегистрирован: 03.11.2007 22:15:54

Сообщение alexs » 04.11.2007 17:02:18

1. Посмотри код этого хитрого символа в utf8
2. Попробуй так:
Код: Выделить всё
UTF8Encode('Тест')+'Œ';

вместо напрямую символа - используй его код

насколько я понимаю
UTF8Encode
преобразует символы конкретной локали в utf8
а твоего символа 'Œ' в этой локали просто нет (или он имеет другой код).
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Flanter » 04.11.2007 19:51:40

Попробовал предложенный метод - не сработало. Попробовал даже вручную закодировать соответствующий символ в UTF-8 в соответствии с информацией, найденной в википедии - тоже не сработало. Кстати, UTF8Encode с локалью дела не имеет - эта функция преобразует WideString-строку (т.е. строку, содержащую именно Unicode-символы) в UTF-8-строку...

А потом я написал ещё одну тестовую программку. И в этой программке один и тот же текст с хитрым символом задал заголовку окна и кнопке:

Код: Выделить всё
gtk_button_new_with_label(Pgchar(UTF8Encode('Русский тест Œ')));
gtk_window_set_title(GTK_WINDOW(Window), Pgchar(UTF8Encode('Русский тест Œ')));


И вот же чудо - на кнопке текст выводится с данным символом, а в заголовке - по прежнему ничего не выводится (если символ убрать Œ, то строка "Русский тест" в заголовке появляется).

В общем, делаю вывод, что FreePascal тут ни причем, а кривая реализация юникода в заголовках окон, по-видимому, в самой GTK. Впрочем, если кто-то всё-таки увидит какой-то изъян в моём коде - буду рад!

alexs, спасибо за помощь!
Flanter
новенький
 
Сообщения: 42
Зарегистрирован: 03.11.2007 22:15:54


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru