php 汇出csv 给excel 97-2003 使用的中文字编码问题

Phanix
·
·
IPFS
·

汇出资料并不是太困难的事情,但是对于excel 97-2003 这样旧版本的excel 来说,中文字的编码是个麻烦

比较新的excel 都已经开始支援中文字使用utf-8 等常用的unicode 编码方式,但是再古早的年代,各种语言(中文、日文、许多的欧系语言)都有各自的编码方式,然后同一个编码可能在不同语言中都被用到,总之就是一团乱。

在utf-8 一统江湖之前,ucs编码也曾经独领风骚一阵子( utf8 与ucs差异),但是ucs-2 固定使用2 bytes,也无法包山包海包所有语言,而ucs-4 则是固定使用4 bytes,在2000年前后那个年代实在是很浪费频宽的一件事情。

所以当utf-8 这个用1~4 bytes,且没有byte order dependency (little-endian / big-endian)的编码方式进入这个乱局后很快就一统江湖,以现在(2019)来说全球的网页有超过九成都已经使用utf-8。

而古早的excel 97-2003 版本,对于中文文字是使用ucs-2 LE BOM (little-endian, with byte order mark),所以如果是直接把csv资料写入档案,那么用excel 97-2003打开,中文文字会全部变成乱码。

解决方式就是要用mb_convert_encoding (为mb_string library) 将资料转成ucs-2LE 编码,然后加上档头的BOM。

 file_put_contents($filename, chr(0xFF) . chr(0xFE) . mb_convert_encoding($strdata, "UCS-2LE", "UTF-8"));

如果BOM改成chr(0xFE) . chr(0xFF) 那就变成了big-endian。

Original link: Phanix's Blog

CC BY-NC-ND 2.0 授权

喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!