web开发中文乱码问题
1 为什么会出现乱码
首先要明确一点:代码将以utf-8,或者其他编码方式存储在存储器里。
2 编码
2.1 php脚本编码和网页显示编码
用eclipse编写一个网页test.php:
1 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 2 <script src="/ysw/jquery-1.7.1.min.js" type="text/javascript"></script> 3 <span id="s">凉快</span> 4 <script type="text/javascript"> 5 <!-- 6 $(document).ready(function(){ 7 $("#s").click(function(){ 8 window.location="second.php?r=凉快"; 9 }); 10 }); 11 12 13 //--> 14 </script>
eclipse工作空间采用utf-8编码,<meta http-equiv="Content-Type" content="text/html; charset=utf-8">,这句话告诉浏览器这个页面采用utf-8编码,那么浏览器采用utf-8解码显示,如果charset设为gb2312则浏览器会用gb2312进行解码,所以会生成乱码。
2.2 SQL语句编码和数据库编码
数据库相关编码:
- 查看数据库支持的字符集:show character set;
- 查看数据库系统字符集设置:show create database dbname;
- 查看表编码: show full columns from tablename; || show create table tabName;
- 查看当前状态:\s
- 数据库连接编码:set names utf8; //告诉系统SQL语句采用 utf8编码
数据库有四级编码:服务器、数据库、表、字段,范围越小级别越高,一般而言数据库编码和表编码、字段编码都一致。
查看数据库编码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
mysql> show Variables like 'char%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+
查看表编码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
show create table t_game_config; | t_game_config | CREATE TABLE `t_game_config` ( `name` char(64) NOT NULL, `passwd` char(16) NOT NULL, `pkey` varchar(8196) NOT NULL, `gameid` int(11) NOT NULL auto_increment, `sandbox` tinyint(4) NOT NULL default '0', `gamekey` char(32) NOT NULL, `userid` int(10) unsigned NOT NULL, `serverid` int(10) unsigned NOT NULL, PRIMARY KEY (`gameid`), UNIQUE KEY `name` (`name`), UNIQUE KEY `gamekey` (`gamekey`), KEY `userid` (`userid`) ) ENGINE=MyISAM AUTO_INCREMENT=42 DEFAULT CHARSET=latin1 |
数据库连接应和数据库编码一致,否则会出现乱码,数据库连接字符编码写在php代码中,如果缺省则采用数据库默认配置。yii中连接编码:
db'=>array( 'connectionString' => 'mysql:host=localhost;dbname=token_conf', 'username' => 'root', 'password' => 'root@pwd@1231', 'charset' => 'latin1', ),
也可以在数据库连接语句之后,SQL语句执行前执行:
mysql_query(ser names utf8);
2.3 php脚本编码
php脚本以utf-8或者gbk编码存在硬盘中,当执行脚本时将脚本调至内存,因此当编码不同时调用strlen()获得的字符串的长度可能是不同的。
3 其他
3.1 将含有中文的字符串转为JSON格式
使用json_encode()方法会对含有中文的字符串进行编码时,会出现中文乱码问题,无论是存到数据库还是直接显示在页面中文都不能正确显示。解决方法:
首先,脚本编码确保是UTF-8,然后采用ch_json_encode()方法(该方法出自一位网友朋友之手,试过可行) http://yungbo.com/page/2
function ch_json_encode($data) { /** * 将中文编码 * @param array $data * @return string */ function ch_urlencode($data) { if (is_array($data) || is_object($data)) { foreach ($data as $k => $v) { if (is_scalar($v)) { if (is_array($data)) { $data[$k] = urlencode($v); } else if (is_object($data)) { $data->$k = urlencode($v); } } else if (is_array($data)) { $data[$k] = ch_urlencode($v);//递归调用该函数 } else if (is_object($data)) { $data->$k = ch_urlencode($v); } } } return $data; } $ret = ch_urlencode($data); $ret = json_encode($ret); return urldecode($ret); }