两篇很好的关于字符编码的文章
sshong 发表于2013年4月13日 21:48:16 更新于2013年4月13日 22:20:03
推荐两篇文章,非常棒:
What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text
Handling Unicode Front To Back In A Web App

从字符编码是什么,到浏览器与后端(PHP)交互,从PHP到mysql交互讲的简单明了。
总结一下:
1、在计算机的世界里,只有二进制。
2、字符集是一些语言符号(如A B C D 中 文)的集合,同时给定每个字符一个对应的数字表示。根据一串二进制,查找对应字符集,能够找到对应字符。
3、unicode字符集基本包含了世界上所有的字符。unicode只规定了每个字符的数字表示,怎么编码成二进制,是UTF-8 UTF-16等编解码的事情。
4、计算机不关心字符,只关心二进制数据流,而人类才需要字符,只有最终显示给人看才需要字符。
5、两个不同的程序在交互时,通常需要发送方告知发送的二进制流采用的编码方式,接收方才能根据这个编码方式解码二进制为字符。
6、乱码通常就是5中双方有人提供的信息不够或者处理方式错误。譬如浏览器输出乱码,通常是服务端没有告诉浏览器要用的编码
7、没事别折腾了,容易晕,用UTF-8吧(如源码文件用utf8存储,http交互指定charset utf-8,mysql存储、连接采用utf-8),搞定一切。

一个小例子:
客户端:
浏览器端强制发送某种编码类型的数据给php如gbk(通常,浏览器端会根据当前页面的编码方式即服务器端返回的content-type charset的类型来编码数据给服务器端)
<html>
    <head>测试charset</head>
    <body>
        <form action='asarea/test.php' method='post' accept-charset="gbk">
            <input type="text" name="str" value="中文">
            <input type="submit" value="测试">
        </form>
    </body>
</html>

PHP端:
//header('Content-Type: text/html; charset=GBK');
header('Content-Type: text/html; charset=UTF-8');
$str = $_POST['str'];
echo $str . '<br>'
;

header GBK不乱码,header UTF-8乱码。
原因:php端其实根本不关心你给我的是什么字符,什么编码,他只是解析这个二进制流,把一些变量的二进制数据存储起来,你给我的是什么样的二进制我就存什么样的二进制。
echo时再把这段二进制输出去。

因此,echo的是gbk编码方式的"中文"两字。如果header告诉浏览器是utf-8方式解码,那可不得乱码吗。

php端什么时候关心你是什么编码方式的数据呢?那得取决于你自己!譬如你要知道这个变量里的第二个字符是啥,你要知道这个字符串的长度,你要匹配这个字符串是否含有某些字符。
标签:编码分类:PHP阅读:1601
评论
暂无评论
添加评论
您的大名,限长10汉字,20英文(*)
电子信箱(*)
您的网站
正文,限长500汉字,1000英文(*)
验证码(*) 单击刷新验证码
联系我
博客订阅