编码问题——ANSI

编码问题——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。

csv.php
1
2
3
4
5
// excel默认ASCI编码,为了正常显示utf8,要加BOM头
header ( "Content-type: text/csv; charset=utf-8");
echo "\xEF\xBB\xBF";

echo 正文...

在UTF-8文件中放置BOM是微软的习惯,而unix又正好反过来:UNIX首行的#!标示依赖于shell解析,而很多shell出于兼容的考虑不检测BOM,所以加进BOM时shell会把它解释为某个普通字符输入导致破坏#!标示。

相关阅读

「带 BOM 的 UTF-8」和「无 BOM 的 UTF-8」有什么区别?网页代码一般使用哪个? - 知乎 (zhihu.com)

字节顺序标记 - 维基百科,自由的百科全书 (wikipedia.org)

“烫烫烫”与“锟斤拷”的原理 - wangwust - 博客园 (cnblogs.com)

字符编码Unicode、UTF-8和ANSI - 简书 (jianshu.com)

字符编码ANSI和ASCII区别、Unicode和UTF-8区别 -CSDN博客

评论