邓世龙的自留地

兼济天下则达 独善其身则穷

标签归档: utf-8

谈谈编码


记得一年前找工作时,阿里巴巴的面试官问了这么一道题,汉字在C语言中是怎么存储的,或者说C语言是如何处理汉字的,对于那时的我是一脸茫然,因为实战经验太少了。前不久,在处理中文标题时出现了乱码问题,组长只在一段代码中改了一句话就解决了问题,觉得非常神奇,于是看这段代码,原来就是关于编码处理的,于是认真的看了这段代码。

通过努力,算是明白了这段代码,其实也就是用了iconv函数族来进行编码之间的转化,再进行特殊处理。例如如果最终目标语言是GBK,可能还需要进行全角和半角之间的转化,繁体到简体的转换。事实上,我们处理时出现了乱码问题正是在繁体到简体的转换时写错了,导致出现乱码。

这里只想写写我自己的理解,在我看来,任何编码保存的文件最后都是字节流,在读取这些字节流时,你只有采用保存文件时采用的编码才不会出现乱码。这就好像加密与解密一样,例如如果一个文件是用utf-8编码的,但你是用GBK打开,此时就会出现乱码了,因为两种编码的编码方式不同。当然还是有一些例外情况,例如如果你是用GB2312保存的文件,用GBK打开是不会出现乱码,因为GBK是兼容GB2312的,GB2312的所有编码的值在GBK中是一样的,只是GBK还利用了GB2312没有用的一些空间来增加了一些编码。而GB18030则又扩充了GBK,包含了更多的字符。

在C语言中,用字符串来保存文本,这些文本都是字节流,只是每种编码占用的空间不同。例如“我是中国人”这5个字,如果是utf-8编码的,因为每个汉字占用3个字节,则要占用15个字节,用strlen可以测出来。如果是GBK编码的,因为每个汉字占用2个字节,则要占用10个字节。对于这样的回答,不知道那个面试官会不会满意呢?

所以这里有一个问题是,给你一个字符串,如果没告诉你用什么编码的,那么要怎么判断它是什么编码的。