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端什么时候关心你是什么编码方式的数据呢?那得取决于你自己!譬如你要知道这个变量里的第二个字符是啥,你要知道这个字符串的长度,你要匹配这个字符串是否含有某些字符。