LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1225|回复: 8

问个关于samba中拷贝文件中文乱码问题。(已解决)

[复制链接]
发表于 2006-4-25 01:28:35 | 显示全部楼层 |阅读模式
我参考了smb.conf关于cp936的选项,与Nautilus关于默认储存Unicode编码修改成储存为gb2312的问题。
现在问题如下:
从windowsxp主机ntfs文件系统拷贝文件到ext3文件系统或从ext3到ntfs一切正常,编码为gb2312编码,在linux主机用nautilus从ext3拷贝中文文件到ntfs为无效的 Unicode编码,用nautilus从ntfs拷贝文件到ext3还是Unicode编码格式,用只支持gb2312的软件观察就是乱码而且不能读取。

希望得到知其然还知其所以然的解答,在此先谢过。

我的locale是zh_CN
发表于 2006-4-25 08:25:03 | 显示全部楼层
都什么年代了,locale怎么还不换utf8?
回复 支持 反对

使用道具 举报

发表于 2006-4-25 17:28:01 | 显示全部楼层
记得有位大侠说过:samba与utf8有仇。我觉得说得非常对
回复 支持 反对

使用道具 举报

发表于 2006-4-25 18:10:13 | 显示全部楼层
没有呀,我用samba没有什么问题的呀

从winxp中的到debia(utf8)相互拷贝文件都没有问题的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-26 22:00:10 | 显示全部楼层
用惯了的东西换来换去让人不习惯。除了换utf-8的locale能从samba软件的配置修改来解决问题吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-27 18:28:12 | 显示全部楼层
Post by Brume
记得有位大侠说过:samba与utf8有仇。我觉得说得非常对

我觉得samba于utf8没什么仇恨,到是于gb编码水火不容,因为我那个现象就很好的解释了,utf8格式拷贝没问题,是gb编码的才有问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-27 20:02:16 | 显示全部楼层
换用utf-8后一切正常,只是在 gtk1库支持的中文环境作一下修改跟gb2312一样,没有感到明显的不适应,只是xmms中英文字体的间距变大了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-27 20:58:47 | 显示全部楼层
问题解决了,原来间距变大了是因为我用的simsun字体的宽度设置的是c,改成p就行了。看来还是utf-8兼容性好些。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-27 21:10:22 | 显示全部楼层
今天真是个好日子,我终于找到关于nautilus关于编码问题的答案了,为了防止链接失效,所以我把它转载了过来。
==========================
转自linuxfans.org作者:xLoneStar (公社论坛版主)
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 可以正常显示网上邻居目录中的本地编码文件名,我也尝试拷贝了几个出来,都没什么问题。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表