[sisyphus] Немного рекламы: FBReader

Yury Aliaev =?iso-8859-1?q?mutab0r_=CE=C1_rambler=2Eru?=
Пт Май 19 13:58:06 MSD 2006


Anton Farygin scripsit:
>>>>С диалогом выбора файлов проблема в кодировке. Так у меня в локали 1251
>>>>вылезает ошибка 
>>
>>>>(FBReader:11675): Pango-WARNING **: Invalid UTF-8 string passed to
>>>>pango_layout_set_text()
>>
>>>>на каждый файл с русским именем.
>>>
>>>а это извини проблема не этой программы.. а чего-то gtk'шного
>>
>>Ойданупрям! (C)
> 
> 
> Именно так. Я даже багу вешал на что-то по этому поводу.
> 
> Там какие-то заморочки с чарсетом для файловой системы.

Не какие-то, а вполне конкретные. В своё время Виталик Липатов составил 
подробнейшие рекомендации по локализации программ, использующих GTK+-2. 
Вот цитата оттуда:

Работа с файлами и файловыми диалогами
======================================
gchar* g_filename_from_utf8(строка,-1,NULL,NULL,NULL)
gchar* g_filename_to_utf8(строка,-1,NULL,NULL,NULL)
получаемые с помощью этих функций строки желательно
освобождать после использования с помощью g_free(указатель)

Во внутренних структурах программы рекомендуется хранить
название файла в filesystem encoding (которая получается
с помощью g_filename_from_utf8), но выдавать на редактирование
и сохранять в конфигурационные файлы - в utf8.

Возможно использование функции
g_filename_from_uri
в чём преимущества пока не знаю.

Для дублирование строк используется функция
g_strdup

Файловому диалогу передаётся название файла в filesystem
encoding.
Устанавливается название файла такой конструкцией:
gtk_file_selection_set_filename(GTK_FILE_SELECTION(opendlg),
filename);
Получается название файла так:
filename =
gtk_file_selection_get_filename(GTK_FILE_SELECTION(fs));

Вот типичный код получения названия файла в кодировке UTF8 (взят
из dia):
const char *filename;
struct stat stat_struct;
filename =
gtk_file_selection_get_filename(GTK_FILE_SELECTION(fs));
if (stat(filename, &stat_struct) == 0) { // File already exist
     char buffer[300];
     char *utf8filename = NULL;
     if (!g_utf8_validate(filename, -1, NULL)) {
         utf8filename = g_filename_to_utf8(filename, -1, NULL,
NULL, NULL);
         if (utf8filename == NULL) {
             message_warning(_("Some characters in the filename
are neither UTF-8 nor you local encoding"));
         }
     }
     if (utf8filename == NULL) utf8filename = g_strdup(filename);
     g_snprintf(buffer, 300,
         _("The file '%s' already exists.\n"
         "Do you want to overwrite it?"), utf8filename);
     ....
     g_free(utf8filename);
}



Подробная информация о списке рассылки Sisyphus