LinuxSir.cn,穿越时空的Linuxsir!

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

SAMBA的中文问题, 经验总结

[复制链接]
发表于 2005-12-8 22:11:03 | 显示全部楼层 |阅读模式
samba 的中文编码问题很让我头疼过一阵子, 也有很多人问到过, 经过比较细致的跟踪, 现在将我的理解和大家共享. 希望对新手有一些帮助, 也免得自己忘掉. 在 Linuxsir 注册这么久了, 第一次写长贴......

/etc/samba/smb.conf 中有三个 global setting, 分别是 dos charset, unix charset, 和 display charset,  充分理解这三个设置对解决这个问题至关重要. 以下用 GB2312, 和 UTF-8 之间的选择来说明问题, GB18030 和 GB2312 应该是类似的.

首先说明, 我原以为 smb.conf 只对 samba 的 server 有意义, 现在看来, 至少是在编码问题上 samba 的客户端也要从这个文件来配置的.

dos charset, 听名字实在很难猜出它是什么意思, 文档里的描述也很模糊, 我也没有搞得很清楚, 只是把试验结果罗列出来. 在两种情况下(UTF-8和GB2312), smbclient 都以 Unicode(UCS16) 请求 server 端的共享, samba server 和 Windows 都认; smbmount 则不同, 在 dos charset = GB2312 时, smbmount 把请求标识为 ASCII, 传输的字符串是 GB2312 编码, 这时也没问题, 而在 dos charset = UTF-8 时, smbmount 的请求标识仍然是 ASCII, 但传输的是 UTF-8 编码, 这时 samba server 认, Windows 不认. 结论: 如果要使用 Windows 的中文共享名, 最好把 dos charset 设置为 GB2312.

unix charset, 笼统的说, 是你的 Linux 系统所使用的编码(文档就是这么说的), 要是展开来讲, 那是 samba 的程序( 包括 client 和 server ) 在本机运行环境中接收到字符串内容时把它**[color="Orange"]看做**是这个编码. 具体的说, 至少包括: 中文文件名的编码, smb.conf 这个文件的编码(如果设了中文共享名的话), 在命令行接收到的参数的编码. 所以要想避免麻烦, 似乎三者都用 UTF-8 最彻底, 唯一的问题是在命令行. 要决定 smbclient 最终接收到什么编码的参数, 这当中包括了 1. 终端仿真程序 2. Shell 3. 中文输入法 4. smbclient 程序本身 这四者之间的交互, 这种关系似乎还没有完全标准化, 所以往往你设置了正确的 dos charset, 却无论如何也连不上中文共享. 据我的经验, 如果把 unix charset 设为 GB2312, 这种问题比较好调试, 另外我用的老系统( FC1 ) 对 UTF-8 的支持似乎不是很好, 所以也应该用 GB2312, 当然这时你也要把磁盘的中文文件名, 以及 smb.conf 这个文件的编码也相应设置. 如果实在搞不定命令行的话有一个办法肯定行, 那就是写一个脚本文件, 保存为你需要的编码, 然后执行这个脚本.  结论: 如果你确信自己可以传 UTF-8 编码的中文字符串给 smbclient, 并且确信系统支持 UTF-8 的文件名, 那就把 unix charset 设置为 UTF-8, 否则用 GB2312 好一些.

display charset, 这个比较简单, 就是 samba 的程序要在屏幕上输出内容时, 把字符串的内部表示(这与我们无关)转换为的编码形式. 因为这只涉及 samba 程序和终端仿真程序之间的交互, 应该比较好调. 比如 gnome-terminal 的终端字符编码设为中文, 那么 display charset 就设为 GB2312, 如果是 UTF-8 那么 display charset 也设为 UTF-8.

就这些了, 大家有什么高见欢迎指正和补充.
发表于 2005-12-9 18:35:48 | 显示全部楼层
不错。。。。

谢谢兄弟,辛苦了;
回复 支持 反对

使用道具 举报

发表于 2007-7-25 12:21:10 | 显示全部楼层
good   
up lz
回复 支持 反对

使用道具 举报

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

本版积分规则

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