您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

php mysql 字符集(三) (转)

2024/3/22 17:07:58发布23次查看
http://bbs.csdn.net/topics/390097514 gbk页面插入数据到utf8表,然后取出到gbk页面 首先,这个setnamesx等价于 setcharacter_set_client=x; setcharacter_set_results=x; setcharacter_set_connection=x; 而这3个设置决定了不同阶段的字符集 ---------------
http://bbs.csdn.net/topics/390097514
gbk页面插入数据到utf8表,然后取出到gbk页面
首先, 这个set names x等价于
set character_set_client = x;
set character_set_results = x;
set character_set_connection = x;
而这3个设置决定了不同阶段的字符集
------------------------------------
如果不加set names utf8
一般缺省情况下这3个设定都是latin1,你可以用show variables like 'character_set%'看一下
ok,这时,
字符集的变化情况是
gbk(输入页面)->latin1(character_set_client)->latin1(character_set_connection)->utf8(数据库)->latin1(character_set_connection)->latin1(character_set_results)->gbk(输出页面)
比如你输入一个严
d1cf(输入的一个gbk字符,被解释为2个latin1字符,因为你的client是latin1)
=>d1cf(2个latin1字符ñï)
->c391c38f(2个utf8字符,进db,注意这时是4个字节,2个字符)
->d1cf(2个latin1字符ñï)
没了....
嗯?为啥没了还能在页面上看到正确的汉字严?
如果你在页面上查看源代码, 你会看到那是乱码(latin字符)
这个是因为html页面是流方式输出到浏览器,浏览器只知道接受一串字符过来,然后根据你指定的编码,比如
来分析显示字符,注意2个latin1字符d1cf和一个gbk汉字严在二进制下是无法区分的,所以它就解释其为汉字,
如果你charset=iso-8859-1了,它就变乱码了
-----------------------------------------------------------------
好, 这下来说set names utf8后, 就是
set character_set_client = utf8;
set character_set_results = utf8;
set character_set_connection = utf8;
那么,字符集变化为
gbk(输入页面)->utf8(character_set_client)->utf8(character_set_connection)->utf8(数据库)->utf8(character_set_connection)->utf8(character_set_results)->gbk(输出页面)
那么严的变化为
d1cf(输入的一个gbk字符,因为你client是utf8....被当成utf8字符)
->但是...好像不是合法的utf8字符....所以...(这步我没测试,到底转成了什么我也不知道)
->乱码(?个utf8字符)(存入数据库)
->乱码(原样取出并传到客户端,因为db和results都是utf8)
页面上就更是乱码了,而且无法变化页面字符集来得到正确的汉字
----------------------------------------------------------
所以,很多人都知道,你的这个情况应该set names gbk,就是
set character_set_client = gbk;
set character_set_results = gbk;
set character_set_connection = gbk;
那么,字符集变化为
gbk(输入页面)->gbk(character_set_client)->gbk(character_set_connection)->utf8(数据库)->gbk(character_set_connection)->gbk(character_set_results)->gbk(输出页面)
那么严的变化为
d1cf(输入的一个gbk字符,因为你client是gbk,所以被正确解释成gbk字符)
->e4b8a5(一个utf8字符,进db,注意这时是3个字节,1个字符)
->d1cf(转回正确的gbk字符)
这时你查看源代码,应该也是正确的字符严
---------------------------------------------------------
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product