|
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 可以正常显示网上邻居目录中的本地编码文件名,我也尝试拷贝了几个出来,都没什么问题。
附件中是我的一个贴图。如果你愿意帮忙测试这样更改的效果,请和我联系。警告:造成你文件系统的任何后果我是不负责的;) |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|