[gnome-cyr] Re: [Gnome-users] Вопрос о кодировках



On Tuesday 04 March 2003 08:21, Dmitry G. Mastrukov wrote:
> Что ж, хорошее начало. Мне кажется, надо:
> 1. Написать тестовую программку, чтобы оценить, действительно ли
> gnome-vfs неверно работает с именами файлов.
Сам по себе gnome-vfs вроде нормально работает с именами файлов.
На примере gedit : там имя файла формируется с пом функции 
gnome)vfs_get_local_path_from_uri() далее в системные вызовы. 
Она и возвращает имя файла в Utf8 кодировке.
Я подумал - что можно попробовать изменить поведение этой функции так чтобы
возвращаемо локальное имя файла уже было в кодировке для локали.
Если программа не использует эту функцию - то проблема останется.

> 2. Если это так, создать баг на багзилле, прикрепив к нему этот патч
> (проверив его).
Это не патч :-)) Это просто пример, его еще доделывать и переделывать :-))
У меня просто сейчас на машине нет собранного gnome2 и времени нет
собирать (может на проздниках). Туды еще нужно добавить проверку на то 
что текущая локаль не UTF8 :

if(g_is_utf8_locale()) {
	/* Выполняем проверки и проеобразования и т.п. */
}

так что кто-нить попробуйте наложить этот diff-файл (см. письмо выше) 
и поделитесь результатом.

> ЗЫ. Дальнейшее обсуждение этой проблемы предлагаю перенести в
> gnome-cyr gnome org, так как проблема носит технический характер и пути
> её решения могут быть не интересны пользователям Гнома, для которых этот
> список позиционируется. О результатах же непременно сюда сообщить.
Ладно. Я тот дифф присоединил с еще раз и копию кинул в gnome-cyr.

PS: Те же самые проблемы возникают и в других приложениях, которые используют
gtk2 (без gnome2) например xfce4 - там та же беда :-((

-- 
С Уважением
Сукиязов Сергей
Инженерный Центр МИКОМ
http://www.micom.net.ru
ICQ: 165166448
diff -Naur gnome-vfs-2.2.0.orig/libgnomevfs/gnome-vfs-utils.c gnome-vfs-2.2.0/libgnomevfs/gnome-vfs-utils.c
--- gnome-vfs-2.2.0.orig/libgnomevfs/gnome-vfs-utils.c	Sat Dec 21 00:15:06 2002
+++ gnome-vfs-2.2.0/libgnomevfs/gnome-vfs-utils.c	Mon Mar  3 19:54:24 2003
@@ -709,7 +709,8 @@
 char *
 gnome_vfs_get_local_path_from_uri (const char *uri)
 {
-	const char *path_part;
+	const char *path_part, *local_path_part;
+        char *result;
 
 	if (!_gnome_vfs_istr_has_prefix (uri, "file:/")) {
 		return NULL;
@@ -726,7 +727,16 @@
 		return NULL;
 	}
 
-	return gnome_vfs_unescape_string (path_part, "/");
+        local_path_part = path_part;
+        if(g_utf8_validate(path_part,-1,0)) {
+            local_path_part = g_filename_from_utf8(path_part,-1,0,0,0);
+        }
+        
+        result = gnome_vfs_unescape_string (local_path_part, "/");
+
+        if(local_path_part!=path_part) g_free(local_path_part);
+
+	return result;
 }
 
 /**
@@ -742,6 +752,7 @@
 gnome_vfs_get_uri_from_local_path (const char *local_full_path)
 {
 	char *escaped_path, *result;
+        char *utf8_full_path;
 	
 	if (local_full_path == NULL) {
 		return NULL;
@@ -749,9 +760,15 @@
 
 	g_return_val_if_fail (local_full_path[0] == '/', NULL);
 
-	escaped_path = gnome_vfs_escape_path_string (local_full_path);
+        utf8_full_path = local_full_path;
+        if(!g_utf8_validate(local_full_path,-1,0)) {
+            utf8_full_path = g_filename_to_utf8(local_full_path,-1,0,0,0);
+        }
+
+	escaped_path = gnome_vfs_escape_path_string (utf8_full_path);
 	result = g_strconcat ("file://", escaped_path, NULL);
 	g_free (escaped_path);
+        if(utf8_full_path!=local_full_path) g_free(utf8_full_path);
 	return result;
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]