编码问题——ANSI
微软的记事本里有个格式叫ANSI,经常用它转码。但是做项目时发现sublime居然没有这种格式,怎么回事呢?
问题场景
数据库的表是utf8mb4格式,导出的csv里有汉字,在excel打开是乱码的,因为excel默认用“ANSI编码”。对于这个问题,网上的解决都是:用微软的记事本把编码改成ANSI。这也太没效率了,至少在我常用的编辑器里转码吧,但是死活找不到哪种编码叫“ANSI”。原来这是个标准,每个国家实现都不一样,自己的win系统是简体中文,对应了GB2312。
ANSI编码是一种对ASCII码的拓展。ANSI编码用0x00~0x7f (即十进制下的0到127)范围的1 个字节来表示 1 个英文字符,超出一个字节的 0x80~0xFFFF 范围,开始用两个字节来表示其他语言的其他字符(也就是说,ANSI码仅在前128(0-127)个与ASCII码相同,之后的字符全是某个国家语言的所有字符)。简体中文编码表GB2312,繁体中文BIG5,日文Shift_JIS,各国有各国的标准。受制于当时的条件,不同语言之间的ANSI码之间不能互相转换,这就会导致在多语言混合的文本中会有乱码。
解决
如何告知excel这个csv是utf8编码呢?需要在文件头加上BOM。
1 | // excel默认ASCI编码,为了正常显示utf8,要加BOM头 |
在UTF-8文件中放置BOM是微软的习惯,而unix又正好反过来:UNIX首行的#!
标示依赖于shell解析,而很多shell出于兼容的考虑不检测BOM,所以加进BOM时shell会把它解释为某个普通字符输入导致破坏#!
标示。
相关阅读
「带 BOM 的 UTF-8」和「无 BOM 的 UTF-8」有什么区别?网页代码一般使用哪个? - 知乎 (zhihu.com)
字节顺序标记 - 维基百科,自由的百科全书 (wikipedia.org)
“烫烫烫”与“锟斤拷”的原理 - wangwust - 博客园 (cnblogs.com)