文件编码问题:20161201

这个问题是在开发中遇到的一个简单的小问题,自己也是第一次遇到。刚开始心里是很模糊的,完全没有什么解决的方案。起初,我以为是不同的系统之间打开统一格式的文件会使用不同的编码,所以,导致的乱码显示问题。不过,都是.txt的文本文件,在不同的文本软件下打开却是不同的效果。比如在WINDOWS系统中打开是默认使用的ANSI编码打开,所以,不会出现任何编码问题。正常显示的,但是,当我们把这个文本文件发送到UNIX系统,Mac系统下使用的时候,使用文本文件打开也是没有问题有题的,但,当我们使用sumlime软件打开的时候,出现了乱码的问题。

科普一下:

ANSI编码一般指Windows-1252编码,是一个256个字符的字集的编码,每个字符由一个字节表示。其中前128个字符(00-7F)和ASCII的7bits编码一样,后128个字符中有一些欧洲国家用的有重音的字符。ANSI编码在不同语言的Windows下也指此语言下的Windows编码页,比如中文环境下指Windows-936(也就是GB2312),日文环境下是Windows-932(JIS)编码等等,也是前128个字符(00-7F)和ASCII的7bits编码一样,其他字符则由2个字节表示。

UTF-8是针对Unicode的可变长度字符编码,一个字符可以由1到4个字节表示,其中由一个字节表示的字符和ASCII的7bits编码一样,而包括中文在内的大部分字符则由3个字节表示。

所以如果文本里只有ASCII的7bits编码的那些,这两种编码是互相兼容没有区别的,但是对其他字符,编码就不同了,而且Windows-1252编码无法表达除了256个字符外的比如中文字符,其他的ANSI编码如Windows-936也只能表示一部分Unicode中的字符。编码格式的不同导致程序无法运行很容易理解,因为同样的字集在不同的编码方式下表达的字符是不同的或者是不能被表示的,除非是ASCII的7bits编码中的那些字符。

解决办法:

为了能够在Mac系统下正常打开文件,把这个文件在Windows下使用记事本打开,然后选择“另存为” -》 选择“编码” -》“utf-8”。保存好之后再发送到Mac系统下,现在就能够正常显示啦。不过,我遇到的问题是:文件是使用程序生成的,默认的编码是ANSI编码,我们想要使用的编码是utf-8编码。所以,在程序生成文件的时候,再使用程序把文件的编码方式转换为utf-8,这样就能够在各个平台正常的显示啦。

 这里的编码转换程序,之前是在网上搜索到一个大牛写的一个工具类,可以实现各种编码之间的相互转换。不过,我的需求就只是把ansi编码转换成为utf8编码。所以,我就抽取了我需要的部分加入了我的程序中。

$str = iconv('GBK', 'UTF-8//IGNORE', $str);

以上是php代码,就是这一个简单的代码就可以实现我的需求了。实现思路就是把文件的内容一次性读入到字符串中,然后,转换为utf-8编码,再写入到文件中即可。

iconv函数:

国际化字符与编码支持

iconv 函数
iconv_get_encoding — 获取 iconv 扩展的内部配置变量
iconv_mime_decode_headers — 一次性解码多个 MIME 头字段
iconv_mime_decode — 解码一个MIME头字段
iconv_mime_encode — Composes a MIME header field
iconv_set_encoding — 为字符编码转换设定当前设置
iconv_strlen — 返回字符串的字符数统计
iconv_strpos — Finds position of first occurrence of a needle within a haystack
iconv_strrpos — Finds the last occurrence of a needle within a haystack
iconv_substr — 截取字符串的部分
iconv — 字符串按要求的字符编码来转换
ob_iconv_handler — 以输出缓冲处理程序转换字符编码