编码问题的总结

查看文件编码

在Linux中查看文件编码可以通 过以下几种方式:

1.在Vim中可以直接查看文件编码

:set fileencoding

即可显示文件编码格式。

如果你 只是想查看其它编码格式的文件或者想解决用Vim查看文件乱码的问题,那么你可以在

~/.vimrc 文件中添加以下内容:

let &termencoding=&encoding

set fileencodings=utf-8,ucs-bom,gbk,cp936

这样,就可以让vim自动识别文 件编码(可以自动识别UTF-8或者GBK编码的文件),其实就是依照fileencodings提供的编码列表尝试,如果没有找到合适的编码,就用 latin-1(ASCII)编码打开。

文件编码转换

1.在Vim中直接进行转换文件编码,比如将一个文件转 换成utf-8格式

:set fileencoding=utf-8

2. iconv 转换,iconv的命令格式如下:

iconv -f encoding -t encoding inputfile   # 比如将一个UTF- 8 编码的文件转换成GBK编码

iconv -f GBK -t UTF-8 file1 -o file2

Linux 对一个3G的文本进行编码转换全过程

本过程中涉及到的Linux的命令有:split, iconv, cat 问题:有一个3G 的文本a.txt,编码格式为gbk,现在需要对其进行转换成为utf-8。 难点:iconv的转换是在内存中进行的,因此3G大小的文本,无法 进行直接转换。 思路:先利用split进行文件切分,然后对每一个字文件进行ivonv转换,最后进行cat合并。

1) ll -h a.txt 查看文件的大小,2.9G

2) wc -l a.txt 查看文件的行数,9千200万行

3) split -l 20000000 a.txt chunk 按照每个文件2千万行进行切割,共分成5个文件 4) 进行转换

iconv -f gbk -t utf-8 chunka > chunka_utf8 -c iconv -f gbk -t utf-8 chunkb > chunkb_utf8 -c iconv -f gbk -t utf-8 chunkc > chunkc_utf8 -c iconv -f gbk -t utf-8 chunkd > chunkd_utf8 -c iconv -f gbk -t utf-8 chunke > chunke_utf8 -c 5) rm chunka chunkb chunkc chunkd chunke 删除原文件

6) cat chunk* > a.txt_utf8 进行合并

至此,工作完成

二、

批 量文件编码转换

本操作有风险,请注意操作前备份文件。

1.将原来所有编码为gb2312的.java文件转换为编码为utf-8 的.java.new文件 for i in find . -name "*.java"; do iconv -f

gb2312 -t utf-8 $i -o $i.new; done

2.将*.java.new文件的.new扩展名去除

find . -name "*.new" | sed 's/\(.*\).new$/mv "&" "\1"/' | sh

三、

  • linux下有 许多方便的小工具来转换编码,

  • 文本内容转换 iconv

  • 文件名转换 convmv

  • mp3标签转换 python-mutagen

四、

用法: iconv [选项...] [文件...]

转换给定文件的编码。

输 入/输出格式规范:

-f, --from-co

de=名称 原始文本编码

-t, --to-code=名 称 输出编码

信息:

-l, --list 列举所有已知的字符集

输出 控制:

-c 从输出中忽略无效的字符

-o, --output=FILE 输出文件

-s, --silent 关闭警告

--verb-?, --help 给出该系统求助列表

--usage 给出简要的用法信息

-V, --version 打印程序版本号

五、

find default -type d -exec mkdir -p utf/{} \; find default -type f -exec iconv -f GBK -t UTF-8 {} -o utf/{} \;

这两行命令将default目录下的文件由GBK编码转换为UTF-8编码,目录结构 不变,转码后

的文件保存在utf/default目录下。

六、

Linux下文件名编码批量转换convmv

由于FC将字 符编码统一成了UTF8,原来在gb18030下建立的ext3分区中的文件和目录,一挂载到FC上就显示成乱码。google遍整个互联网,说对于目录 名和文件名,有一个叫convmv的软件可以对其进行自动转换。

今日下载了convmv,摸索了一套使用方法如下:

convmv -f code1 -t code2 -r

code1:分区原来使用的字符集编码。支持gb2312、gbk、 big5,不支持gb18030和big5-hkscs。 code2:预转换到的字符集编码。对于FC,这里填写utf8

-r 参数:转换子目录。

dir:要转换的目录,当前目录用./表示。

回车执行,这个时候convmv会显示执行的结果,但不会真正对文件进 行修改。并提示使用--replace参数进行修改。

七、

批量转换文件的编码

for i in `find ./ -name *.htm` ; do echo $i;iconv -f gb18030 -t utf8 $i -o

/tmp/iconv.tmp;mv /tmp/iconv.tmp $i; done

find -name “*.htm“ \

-exec iconv -f gb2312 -t utf8 ‘{}‘ -o /tmp/iconv.tmp \; \ -exec mv /tmp/iconv.tmp ‘{}‘ \;

修改你的.vimrc文件,让其支持 gb2312就行,会自动识别的。

可以参考我的设置

代码:

"设定文件编码类型,彻底解决中文编码问题

let &termencoding=&encoding

set fileencodings=utf-8,gbk,ucs-bom,cp936

按照karron的方法解决了终端中vi看中文字问题。谢谢

略微查了一下.vimrc中添加内容的含意,这篇文章有相关解释。

http://blog.dawnh.net/comment.php?type=trackback&entry_id=59

内容如下:

vim中编辑不同编码的文件时需要注意的一些地方

此文讲解的是vim编辑多字节编码文档(中文)所要了解的一些基础知识,注意其没有涉及gvim,纯指字符终端下的vim。

[vim编码方面的基础知识]

1,存在3个变量:

encoding----该选项使用于缓冲的文本(你正在编辑的文件),寄存器,Vim 脚本文件等等。你可以把 'encoding' 选项当作是对 Vim 内部运行机制的设定。

fileencoding----该选项是vim写入文件时采用的编码类型。

termencoding----该选项代表输出到客户终端(Term)采用的编码类型。

2,此3个变量encoding----与系统当前locale相同,所以编辑文件的时候要考虑当前locale,否则要设置的东西就比较多了。

fileencoding----vim打开文件时自动辨认其编码,fileencoding就为辨认的值。为空则保存文件时采用encoding的编码,如果没有修改encoding,那值就是系统当前locale了。 termencoding----默认空值,也就是输出到终端不进行编码转换。

由此可见,编辑不同编码文件需要注意的地方不仅仅是这3个变量,还有系统当前locale和、文件本身编码以及自动编码识别、客户运行vim的终端所使用的编码类型3个关键点,这3个关键点影响着3个变量的设定。

如果有人问:为什么我用vim打开中文文档的时候出现乱码,

答案是不确定的,原因上面已经讲了,不搞清楚这3个关键点和这3个变量的设定值,出现乱码是正常的,倒是不出现乱码那反倒是凑巧的。

再来看一下常见情况下这三个关键点的值以及在这种情况下这3个变量的值:

1.locale----目前大部分Linux系统已经将utf-8作为默认 locale了,不过也有可能不是,例如有些系统使用中文locale zh_CN.GB18030。在locale为utf-8的情况下,启动vim后encoding将会设置为utf-8,这是兼容性最好的方式,因为内部 处理使用utf-8的话,无论外部存储编码为何都可以进行无缺损转换。locale决定了vim内部处理数据的编码,也就是

encoding。

2.文件的编码以及自动编码识别----这方面牵扯到各种编码的规则,就不一一细讲了。但需要明白的是,文件编码类型并不是保存在文件内的,也就是说没有 任何描述性的字段来记录文档是何种编码类型的。因此我们在编辑文档的时候,要么必须知道这文档保存时是以什么编码保存的,要么通过另外的一些手段来断定编 码类型,这另外的手段,就是通过某些编码的码表特征来断定,例如每个字符占用的字节数,每个字符的ascii值是否都大于某个字段来断定这个文件属于何种 编码。这种方式vim也使用了,这就是vim的自动编码识别机制了。但这种机制由于编码各式各样,不可能每种编码都有显著的特征来辨别,所以是不可能 100%准确的。对于我们GB2312编码,由于其中文是使用了2个acsii值高于127的字符组成汉字字符的,因此不可能把gb2312编码的文件与 latin1编码区分开来,此自动识别编码的机制对于gb2312是不成功的,它只会将文件辨识为latin1编码。此问题同样出现在gbk,big5 上等。因此我们在编辑此类文档时,需要手工设定encoding和fileencoding。如果文档编码为utf-8时,一般vim都能自动识别正确的 编码。

3.客户运行vim的终端所使用的编码类型----同第二条一样,这也是一个比较 难以断定的关键点决这个问题。此问题更多出现在我们的 windows desktop机远程ssh登录服务器的情况下,这里牵扯到不同系统的编码转换问题。所以又与windows本身以及ssh客户端有很大相关性。在 windows下存在两种编码类型的软件,一种是本身就为unicode编码方式编写的软件,一种是ansi软件,也就是程序处理数据直接采用字节流,不 关心编码。前一种程序可以在任何语言的windows上正确显示多国语言,而后一种则编写在何种语言的系统上则只能在何种语言的系统上显示正确的文字。对 于这两种类型的程序,我们需要区别对待。以ssh客户端为例,我们使用的putty是unicode软件,而secure CRT则是ansi 软件。对于前者,我们要正确处理中文,只要保证vim输出到终端的编码为utf-8即可,就是termencoding=utf-8。但对于后者,一方面 我们要确认我们的windows系统默认代码页为cp936(中文windows默认值),另一方要确认vim设置的termencoding= cp936。

最后来看看处理中文文档最典型的几种情况和设置方式:

1.系统locale是utf-8(很多linux系统默认的locale形 式),编辑的文档是GB2312或GBK形式的(Windows记事本默认保存形式,大部分编辑器也默认保存为这个形式,所以最常见),终端类型utf- 8(也就是假定客户端是putty类的unicode软件)

则vim打开文档后,encoding=utf-8(locale决定的),fileencoding=latin1(自动编码判断机制不准导致的),termencoding=空(默认无需转换term编码),显示文件为乱码。 解决方案1:首先要修正fileencoding为cp936或者euc-cn(二者一样的,只不过叫法不同),注意修正的方法不是:set fileencoding=cp936,这只是将文件保存为cp936,正确的方法是重新以cp936的编码方式加载文件为:edit ++enc=cp936,可以简写为:e ++enc=cp936

你可能感兴趣的:(编码问题的总结)