Nautilus 网上邻居中文乱码的问题的解决
rh9 用户都知道,Nautilus 文件管理器中输入 smb:// 就可以访问局域网网上邻居,但是进入以后中文文件名是看不到的,显示为“无效的 Unicode”。当然,那些文件名确实不是 utf-8 编码的,而是 GB* 编码。而无论 G_BROKEN_FILENAMES 是否设定,都没有效果。然而同时,在本地文件系统中的文件,却无论文件名是本地编码,还是 unicode,都可以正常显示,且受G_BROKEN_FILENAMES 的影响。这让我们大家觉得,是 smb:// 模块不好,导致文件名显示不正常。
可再多试验几次,就会发现这并非 smb:// 独有。如果安装了 nautilus-cd-burner,就会多一个 burn://,拷贝进去本地编码的文件名,同样显示为 “无效的 unicode”。换句话说,本地编码的文件名,除了在本地文件系统外,都无法被显示,且无论 G_BROKEN_FILENAMES 是否设定。
我们打开 nautilus 的源码,在 libnautilus-private/nautilus-file.c 文件的 2396 行,函数 nautilus_file_get_display_name_nocopy() 中,大约的,有以下代码段:
name = nautilus_file_get_name (file);
...
if (has_local_path (file)) {
...
if (broken_filenames || !g_utf8_validate (name, -1, NULL)) {
utf8_name = g_locale_to_utf8 (name, -1, NULL, NULL, NULL);
...
也就是说,只有当该文件是个本地文件时,才会去判断 G_BROKEN_FILENAMES,以及尝试去转换文件名。除此之外的所有其他文件名,只要不是 utf-8 的,统统显示为 “无效的 Unicode”。
我不知道转换工作为什么只对本地文件做,或者说,不知道如果对所有 URI 都进行转换会造成什么问题。所以我把转换的代码挪到了 if (has_local_path (file)) 判断之前。现在,我的 nautilus 可以正常显示网上邻居目录中的本地编码文件名,我也尝试拷贝了几个出来,都没什么问题。
附件中是我的一个贴图。如果你愿意帮忙测试这样更改的效果,请和我联系。警告:造成你文件系统的任何后果我是不负责的;) http://www.linuxfans.org/nuke/modules.php?name=Forums&file=viewtopic&t=24106&highlight=gnome+nautilus+%B2%B9%B6%A1 很高兴看到这个问题已经引起一些重视。我看了这串贴子,由于补丁所补版本与现在可能有差距,我不敢说领悟了它的意思,只是从现在的代码看,这样补是会造成问题的。另外,该贴子最后也没有形成决议。
我的建议,就是1)取消掉
if (has_local_path (file))
判断,使文件名转换对所有文件都有效,而不仅仅是本地文件。
2) 去掉 have_broken_filenames () 的判断,这在这里没用,文件名如果不是 utf-8,就会将其当作 locale encoding 再尝试一次,无论 G_BROKEN_FILENAMES 设没设,这么做都是不会错的
3) 可能会有点争议,就是如果该文件名既非 utf-8,又非 locale encoding,那么它就真的是一个无效的文件名,我建议此时将其当作 ISO-8859-1 编码而转换。这次转换是一定会成功的。此时你会看到它显示为真正的“乱码”字符,就是好像在非中文环境中看到的中文一样,但即使这样它多少也能提供一些信息,总比光的“无效的 Unicode”要好点
这样改完后,nautilus 对任何文件名,都会尝试1)当作 unicode 来显示,2) 如果不行,就当作本地编码(如 GB18030)来显示,3) 如果再不行,就当作拉丁字符来显示(比较不会出现)。无论你的文件名是 utf-8 编码还是 GB2312/GBK/GB18030 编码,在 nautilus 中都将一视同仁
欢迎对我的改法发表意见。稍候我会去实作这些修改,如果有人愿意试用那就更好了 我的改法意思和你原来的差不多,在前头加入
if (!g_utf8_validate (name, -1, NULL))
name =g_locale_to_utf8 (name, -1, NULL, NULL, NULL);
不管是否本地文件,全转成utf8
我的改法可能不稳定,譬如如果是big5编码的文件名将强行按locale encoding转成utf8编码显示,很可能引起nautilus崩溃,因此最好还是按照你第三点再次转换显示,但我没试过这样进一步修改,不知道有什么效果(最多是nautilus显示时崩溃,应该不会影响到文件系统的,因为这个只是显示问题,拷贝文件是没问题的)
最新的nautilus还没修正这个??........
靠,都什么时候的事了!.......
[删去发脾气的不当言语若干,昨晚拨号上网,心情特差] 就事论事最好
别搞的话里有话似的 这样的改法很容易,我稍后就改一下,也会处理转换失败的情况,然后包成 rpm 放出来。
但这事还没完,视图里是显示正常了,可是拷贝文件的进度对话框中还是显示无效文件名。另外还有一个大漏洞,如果你在一个 locale encoding 编码文件名上打开属性对话框,再关闭后,这个文件名就被改成了 utf-8 的了!其实用户并没有想改名,却改掉了。
我一直有订阅 nautilus 的邮件列表,似乎并未看到有人报告这个问题的修正,否则我早就参与讨论了,不知是否是我有疏漏,还是前辈们报告的时机不好,也许该再多报一次? 这样的改法很容易,我稍后就改一下,也会处理转换失败的情况,然后包成 rpm 放出来。
但这事还没完,视图里是显示正常了,可是拷贝文件的进度对话框中还是显示无效文件名。另外还有一个大漏洞,如果你在一个 locale encoding 编码文件名上打开属性对话框,再关闭后,这个文件名就被改成了 utf-8 的了!其实用户并没有想改名,却改掉了。
我一直有订阅 nautilus 的邮件列表,似乎并未看到有人报告这个问题的修正,否则我早就参与讨论了,不知是否是我有疏漏,还是前辈们报告的时机不好,也许该再多报一次?
当时我也留意到进度提示框的乱码了,不过,一直没找到该下手的地方,你再看看能否修改
你说的打开属性对话框然后关闭的操作我没有试过,可能真有这个问题,你试试能否也一并修改掉,我现在工作环境全是win,用linux时间不多,连测试都成问题
这个乱码问题我最早知道的是在rh8里,当时mozilla版主立即搞了个补丁,效果不错,后来我也改了一下,就是上面的帖子,觉得效果不好,也没有意思去提交
你改好后测试一下,效果好的话提交给nautilus小组试试
成果
屏幕截图本图中所有文件名均为 GB2312 编码
补丁发表
补丁: nautilus-2.4.1-locale-filename.patch更改以下行为:
1) 当前编码的文件名,在图标视图和列表视图中,在包括smb:// 在内的所有文件系统中,都能被正常处理显示,而不再是只有本地文件系统才能显示
2) 在拷贝/移动文件进度对话框中,也能正常显示当前编码文件名,而不是仅仅标一个“无效的 Unicode”字样
这样更改后,基本上当前编码文件名将和 utf-8 文件名一起被一视同仁地处理了。 打过此补丁的 rpm 包,我已经做好,位于
http://auvtech.com/~xinzhen/downloads/GNOME/2.4/farm/nautilus/
需要 Gnome 2.4,也可以从我的站上获得。希望遇到过这个问题的朋友测试了后告诉我一下效果 怎么用啊,我是新手,不好意思 怎么用啊,我是新手,不好意思
安装上这个 i586.rpm 结尾的包,然后……就行了呀 几位高手能否把xfsamba也给改成支持中文文件名的?
还有smb4k解决了中文文件名的问题,但只能用在kde下,还是xfsamba正统些。 xfsamba用起来太不习惯了. 要求置顶
页:
[1]
2