本文包含2个主题:
1. linux环境编码。涉及到文件编码,vim编码设置,terminal编码设置之间的关系。
2. linux c/c++程序中如何进行字节编码转换。
最近在做一个windows程序移植linux的项目,其中设计到文本处理,由此衍生出各种字符编码的问题,在这里记录一下。
linux环境编码
文件编码
文件编码指的是文件本身的编码,在文件创建时指定,文件修改时不发生改变。可以通过file命令查看。当文件创建时,默认的文件编码方式是gbk,因为gbk是ASCII的扩展,其0~127的字符是完全一样的。
文件编码是可以改变的,比如vim的set fileencoding就可以改变文件编码。当文件编码发生改变时,其中每一个字符都将重新编码。比如同样一个中文“中”字,在gb18030的文件中占2个字节,而在utf-8的文件中要占3个字节。
vim编码设置
vim可以设置按何种编码打开文件,使用命令:set fileencodings命令,可以设置vim打开文件所采用的编码方式,多个文件编码以逗号分隔。当打开一个文件时,vim按照编码顺序依次尝试,以最可能的编码方式打开目标文件。由于vim对编码的识别并非100%准确,因此在打开的时候可能出现乱码。
vim也可以设置默认的文件保存编码。使用命令:set fileencoding,设置默认的文件编码方式,当新建一个文件时,将以这种编码方式保存。
terminal编码设置
terminal的编码方式常常与vim的编码方式产生混淆。基本来讲:terminal的编码方式只决定了在terminal上显示的字符以何种编码识别。当terminal的编码方式与文件实际的编码方式不匹配时,则显示出来的字符则可能出现乱码。但是terminal的编码方式不会对文件编码造成任何影响,当输入字符并保存时,仍然是按文件自身的编码保存的。