LinuxSir.cn,穿越时空的Linuxsir!

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

关于编码的问题

[复制链接]
发表于 2007-12-4 15:04:06 | 显示全部楼层 |阅读模式
我一直不太明白在各种locale下的文件名是如何编码的。有时从windows拷贝过去的文件名是乱码,有时有时好的。例如mount windows分区的时候加上-o iocharset=utf8就可以正确的读文件名,那么这个参数到底是什么意思呢?是说这个分区的编码是utf8还是说需要把它转换成utf8?一直没有弄明白。
提这个问题的原因是我写的jsp里面显示目录的文件名时显示的是乱码。参考了网上很多方法都搞不定。但是我在windows上调试的时候却能正确显示汉字文件名。

说得很模糊,因为我不清楚问题到底出在哪里。请问各位对此有什么高见,或者给点文章我看看,很郁闷现在。
发表于 2007-12-4 15:54:54 | 显示全部楼层
iocharset=utf8是指把windows下的文件名编码(cp936)转换成linux下用的编码utf8,这样就在utf8编码的linux下就能正常显示windows分区下的中文文件名了(当然,得有正常工作的中文字体)
回复 支持 反对

使用道具 举报

发表于 2007-12-4 16:01:14 | 显示全部楼层
编码的问题解决方法只有一个:
用什么编码的,就用什么解码
就是这么简单

你要知道原来是什么编码,要知道显示过程中每一个软件每一个层次都是使用什么编码,都搞对了就行了

就纳了闷了,这方面哪存在什么问题
回复 支持 反对

使用道具 举报

发表于 2007-12-4 16:08:08 | 显示全部楼层
问题在于接触linux之前就不曾遇到过编码问题,甚至都不知道编码这个东西
所以一到linux下时,对各个层面上使用的是什么编码一时很难弄清楚
而且转换来转换去的,也不知道转了几遍
反正很容易搞糊涂就是了

虽然现在明白了点
但依然记得曾经的糊涂
而且现在有时也还被弄糊涂了

现在再糊涂也就是因为不知道过程中使用了几个编码,分别是什么
回复 支持 反对

使用道具 举报

发表于 2007-12-4 16:12:41 | 显示全部楼层
Post by goodluck1982;1791425
问题在于接触linux之前就不曾遇到过编码问题,甚至都不知道编码这个东西
所以一到linux下时,对各个层面上使用的是什么编码一时很难弄清楚
而且转换来转换去的,也不知道转了几遍
反正很容易搞糊涂就是了

虽然现在明白了点
但依然记得曾经的糊涂
而且现在有时也还被弄糊涂了

现在再糊涂也就是因为不知道过程中使用了几个编码,分别是什么

win上以前不还有南极星什么的么,也是编码问题阿
可能是国内比较封闭,一个人一辈子只用936就可以了,开源项目里面德日西阿拉伯希腊俄语什么的一上utf8就不可避免了
回复 支持 反对

使用道具 举报

发表于 2007-12-4 17:09:28 | 显示全部楼层
Post by goodluck1982;1791425
问题在于接触linux之前就不曾遇到过编码问题,甚至都不知道编码这个东西
所以一到linux下时,对各个层面上使用的是什么编码一时很难弄清楚
而且转换来转换去的,也不知道转了几遍
反正很容易搞糊涂就是了

虽然现在明白了点
但依然记得曾经的糊涂
而且现在有时也还被弄糊涂了

现在再糊涂也就是因为不知道过程中使用了几个编码,分别是什么


我们所谓的编码问题,本质上只原有的系统同国际化的标准之间的兼容问题。很多人接触Linux遇到乱码,不是因为Linux的编码处理的不好,而是这些人使用的原有的系统的编码的解决方案的问题。

比如Windows目前采用的解决方案,即内部使用Unicode再转为本地化编码的方法。其实只为自己的开发和向前兼容提供便利,并没有解决数据(尤其是文件)交换时的问题。像SMB协议,如果真的采用Unicode,我们用Linux访问也根本不会遇到乱码的问题。而衍生的,想MP3等媒体文件的id3v1的tags,也是因为这这种方案造成的。

这种方案看似有利于本地化,但是在网络的普及所促成的国际化的大环境下,毛病就暴露了出来。比如中日韩用户交换MP3时,就会出现乱码问题。中日韩相互访问各自的网站,也会时常会出现因为不指定encoding而导致页面乱码。同样道理,我们使用Linux出现乱码也是因为Linux的国际化社区背景,原来系统的编码问题遇到Linux就暴露了出来。因此乱码是Windows的问题,不是Linux的问题。

而解决的办法只有在开发新的协议和媒体格式的时候,考虑到编码的问题,或者使用统一的编码,或者使用编码标记。eMule和完善后的BT的torrent文件格式,采用了前者,而ID3v2则采用了后者。但是对于大量不支持国际化编码的协议和文件格式。只能采用假设其默认编码或者运行时给用户选择的办法解决了。比如我们配置Samba客户端解决乱码问题,和XMMS等播放器中的默认编码等,就是前者。而一些BT客户端每次添加新的torrent文件时会显示集中编码解码的结果让用户选择解码正确的一种,就属于后者。

也许有人认为这种问题微不足道,大多数人根本没必要接触其他编码。但是这个问题是潜在的,总有一天会我们的国家会成为日韩那样开放的现代化国家,我们可千万不能托了后腿哦。

所以Byakko_Ang认为使用Linux系统,使用UTF-8的locale,并且让文本和MP3的tags使用utf8编码是一中爱国行为。应当多多提倡。:-)
回复 支持 反对

使用道具 举报

发表于 2007-12-4 17:35:54 | 显示全部楼层
Post by goodluck1982;1791425

所以一到linux下时,对各个层面上使用的是什么编码一时很难弄清楚

那就慢慢搞
直到搞清楚为之

而且,搞清楚这东西不是你想象的那么难

还有就是如果你还没用utf8,尽早转utf8,Linux里用utf8会省很多事
回复 支持 反对

使用道具 举报

发表于 2007-12-4 20:54:25 | 显示全部楼层
嗯,我现在用的就是utf8了。
对于window的中文编码,如果你是在国内的环境下可以用GB18030,因为各个国标(GB)的关系如下:
GB2312包含于GBK,GBK包含于GB18030。而GB18030也只包含到CJK-extA,一共有2万多个汉字。
不过CJK-extB, C 那数万汉字恐怕90%以上的人一辈子也不会见过的 : )
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-5 14:25:08 | 显示全部楼层
现在实验室的那台服务器上有大量文档,都是中文名,很多是在windows下创建的使用sftp或者ftp传过来的,也有我直接在服务器上创建的(locale是zh_CN.utf-8),还有的是我从我的linux下传过来的(zh_CN.gbk),反正各种各样的文件都有,那么这些文件的名字编码是一样的吗?反正我一直都无法用一种统一的办法把他们都显示清楚。
    再就是传输的信道上本身就可能会改变文件名的编码,ftp,ssh的各种实现到底如何传输文件名信息,是否改变编码我也不太清楚。例如我在我的gentoo下面用sftp把这些文档(还有挂在服务器上bt下来的电影)下载下来的时候,有些文件名就都是些乱码,但那是用windows下面的ssh工具下载下来,看到的文件名就是正常的。
    如果对于单独的一个系统,我可以统一一个编码不变,但是不可避免会和其他的主机交换信息,那么多种编码放在一起该如何处理呢?其实文件本身的编码我倒是无所谓,主要是这个文件名的乱码很讨厌。老板要我写个web的文档管理程序,在写程序的时候处理起来很是麻烦。
回复 支持 反对

使用道具 举报

发表于 2007-12-5 14:57:30 | 显示全部楼层
Post by woodenapple;1791870
现在实验室的那台服务器上有大量文档,都是中文名,很多是在windows下创建的使用sftp或者ftp传过来的,也有我直接在服务器上创建的(locale是zh_CN.utf-8),还有的是我从我的linux下传过来的(zh_CN.gbk),反正各种各样的文件都有,那么这些文件的名字编码是一样的吗?反正我一直都无法用一种统一的办法把他们都显示清楚。
    再就是传输的信道上本身就可能会改变文件名的编码,ftp,ssh的各种实现到底如何传输文件名信息,是否改变编码我也不太清楚。例如我在我的gentoo下面用sftp把这些文档(还有挂在服务器上bt下来的电影)下载下来的时候,有些文件名就都是些乱码,但那是用windows下面的ssh工具下载下来,看到的文件名就是正常的。
    如果对于单独的一个系统,我可以统一一个编码不变,但是不可避免会和其他的主机交换信息,那么多种编码放在一起该如何处理呢?其实文件本身的编码我倒是无所谓,主要是这个文件名的乱码很讨厌。老板要我写个web的文档管理程序,在写程序的时候处理起来很是麻烦。


同样的问题,关注中
我在使用ftp传东西时,由于来源是windows,编码不同文件名总是不能正确显示
回复 支持 反对

使用道具 举报

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

本版积分规则

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