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编码

数据库有四级编码:服务器、数据库、表、字段,范围越小级别越高,一般而言数据库编码和表编码、字段编码都一致。

查看数据库编码:

View Code
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/ | 
+--------------------------+----------------------------+

查看表编码:

View Code
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);
}

 

 

 

posted @ 2012-08-09 16:29  compus135  阅读(2343)  评论(0编辑  收藏  举报