LINUX.ORG.RU

Русские буквы в gtk 2.0


0

0

Здравствуйте, товарищи! Я имел несчастье коснуться этой избитой темы, наверное, не тем местом, что все. Русский текст в моём приложении меня отображается, а вот с отдельными буквами есть проблема. const gchar *string = "абвгд"; g_print("%s", string); for(i=0; i<5; i++) g_print("%c is %d\n", string[i], string[i]); На это комп отвечает: абвгд &#65533; is -48 &#65533; is -80 &#65533; is -48 &#65533; is -79 &#65533; is -48

(main_dialog:15100): Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text() Естественно, я не совсем это ожидал увидеть. Предвосхищая вопрос о локалях, philip:~# locale LANG=ru_RU.UTF-8 LC_CTYPE="ru_RU.UTF-8" LC_NUMERIC="ru_RU.UTF-8" LC_TIME="ru_RU.UTF-8" LC_COLLATE="ru_RU.UTF-8" LC_MONETARY="ru_RU.UTF-8" LC_MESSAGES="ru_RU.UTF-8" LC_PAPER="ru_RU.UTF-8" LC_NAME="ru_RU.UTF-8" LC_ADDRESS="ru_RU.UTF-8" LC_TELEPHONE="ru_RU.UTF-8" LC_MEASUREMENT="ru_RU.UTF-8" LC_IDENTIFICATION="ru_RU.UTF-8" LC_ALL= Судя по всему, ответ где-то на поверхности... но в какой стороне? :)

anonymous

Извините за непонятный вид, переписал нормально: Я имел несчастье коснуться этой избитой темы, наверное, не тем местом, что все. Русский текст в моём приложении меня отображается, а вот с отдельными буквами есть проблема.

const gchar *string = "абвгд";

g_print("%s", string);

for(i=0; i<5; i++)

g_print("%c is %d\n", string[i], string[i]);

На это комп отвечает:

абвгд

&#65533; is -48

&#65533; is -80

&#65533; is -48

&#65533; is -79

&#65533; is -48

(main_dialog:15100): Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text()

Естественно, я не совсем это ожидал увидеть. Предвосхищая вопрос о локалях

philip:~# locale

LANG=ru_RU.UTF-8

LC_CTYPE="ru_RU.UTF-8"

LC_NUMERIC="ru_RU.UTF-8"

LC_TIME="ru_RU.UTF-8"

LC_COLLATE="ru_RU.UTF-8"

LC_MONETARY="ru_RU.UTF-8"

LC_MESSAGES="ru_RU.UTF-8"

LC_PAPER="ru_RU.UTF-8"

LC_NAME="ru_RU.UTF-8"

LC_ADDRESS="ru_RU.UTF-8"

LC_TELEPHONE="ru_RU.UTF-8"

LC_MEASUREMENT="ru_RU.UTF-8"

LC_IDENTIFICATION="ru_RU.UTF-8"

LC_ALL=

Судя по всему, ответ где-то на поверхности... но в какой стороне? :)

anonymous
()
Ответ на: комментарий от anonymous

Не знаю GTK, но знаю C, поэтому попробую так догадаться:

const gchar *string = "абвгд";

"абвгд" - обычная, не wide-char, строка. Если ты её компилируешь в UTF8-окружении, она будет занимать порядка 10 символов.
Т.к. ты её присваиваешь gchar*, значит gchar это есть обычный char.

g_print("%s", string);

Здесь всё понятно, ты это 10 байтов выводишь, в UTF-консоли они отображаются как 5 русских букв

цикл:

а вот здесь ошибка, ты выводишь 5 первых байтов из UTF-строки. Естественно там будет мусор. Во-первых надо писать так:

for(i=0; string[i]; i++)
g_print("%c is %d\n", string[i], string[i]);

Во-вторых это тоже будет мусор, ищи gtk-шные функции для извлечения символа из multibyte-строки

В-третьих, никогда не используй UTF8 в программах, используй его только в качестве формата обмена, а в программах используй UCS32.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

не gtk-шные функции, glib-ные, за юникод отвечает glib

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.