有许多人像我一样做建站系统的,软件要自动读取网页模板,并且在最后生成包含实际内容的网页。那么,读取网页模板时往往需要考虑“编码”这一问题。但是,很老实地告诉你,要想自动判断编码,没有十全十美的办法。
首先要说明一点:编码问题只在保存文件、读取文件和网络传输过程中体现。也就是说,一段文字(比如汉字)存放在内存里是没有编码问题的,目前的操作系统内核都是UNICODE的,也就是说,汉字也好、英文字母也好、数字也好,计算机都是当成双字节字符来处理的。当这些内容要写入文件、或者从文件读取、或者通过网络从一台机传输到另一台机时,才会发生UNICODE与其它编码的转换。
那么,当我们编写程序从硬盘读取一个文件时,往往要去判断它是什么编码的,这样才可以真正从文件里提取出实际的内容。
写到这里,我还是想先纠正网友们的一个误区,网友们往往说“判断GB2312还是utf-8”,其实GB2312不是文件编码类型,而是网页编码类型。它只是表示网页里的汉字怎样解释。而文件本身,是ansi编码的。文件的编码比网页编码重要得多,因为要知道网页编码,先要能分析网页内容,而分析网页内容之前得先知道文件编码。
那么,一个文件是ansi还是unicode还是utf-8,是否有办法自动判断呢?
办法当然是有的,可惜的是,既没有简单的办法,也没有通行的办法。
第一个办法是检查BOM,只要用二进制方法读入两个字节看看即可。如果是FF FE或FE FF就是unicode编码。如果是EF BB BF就是utf-8。可惜的是,utf-8文件不一定含BOM。如果也去检查BOM,会得出ansi的错误答案。
第二个办法是分析文件内容,可是这个办法几乎是不太可行的。如果一个文件开头连续10000个ascii符号(英文字母、数字、空格),那你要分析到第几个字符才能结束?著名的UltraEdit就有这样的一个BUG。
第二个办法还有个大问题,符合1110xxxx 10xxxxxx 10xxxxxx格式的未必都是utf-8字符,它完全可能是一个半GBK编码。
也许你要说了,那么我规定每个文件都加BOM就行了?其实这也不是好办法。做网站技术的人可能研究过BOM,但是做美工的人可能根本不关心。你要求你的合作伙伴去了解不属于他们认识范围的事物有点太不人道。更重要的是,如果你做PHP的建站系统,你要当心PHP不支持BOM。
最后办法还是有的,要不然IE、记事本等等软件都别干了。但是我们做网站系统没必要花那么多代价。我认为,不要太指望用程序自动识别编码。我曾经在我做的系统里加入这样的代码去兼容ansi和utf-8的模板网页,后来还是放弃了,我最后选择了要求我的用户严格地制作GB2312或者utf-8的网页模板。其实这样大家都省心。
本站文章皆为作者原创,其它媒体(包括但不限于报刊、杂志、网站、电视、电台)未经作者书面许可严禁转载(或部分摘录)!

绝对菜鸟
未填
未填
yu@sky.la
时间:2009-05-31 12:39:19