thinkphp — 解决连接mssql后台管理菜单显示中文乱码问题(备忘)

一开始使用的是mysql,数据库的编码是UTF-8

示例一:

后来换数据库,mysql换成mssql2005,数据库编码为GBK,管理菜单出现乱码,如下所示(左图正常,右图乱码)

PHP页面转UTF-8编码问题

图片 1图片 2

1.在代码开始出加入一行: header(“Content-Type:
text/html;charset=utf-8”);

解决方法如下:

2.PHP文件编码问题
点击编辑器的菜单:“文件”->“另存为”,可以看到当前文件的编码,确保文件编码为:UTF-8,如果是ANSI,需要将编码改成:UTF-8。

第一,查看数据库,找到数据表:ch_node,找到需要进行转码的字段

3.PHP文件头BOM问题:
PHP文件一定不可以有BOM标签,否则,会出现session不能使用的情况,并有类似的提示:

图片 3

Warning: session_start() [function.session-start]: Cannot send
session cache limiter – headers already sent

这是因为,在执行session_start()
的时候,整个页面不能有输出,但是当由于前PHP页面存在BOM标签,PHP把这个BOM标签当成是输出了,所以就出错了!
所以PHP页面一定要删除BOM标签

第二,打开 “ 项目名/Admin/Lib/Action/UiAction.class.php”

删除这个BOM标签的方法:

在  public function menu($from='') {} 中,将读取出来的中文字段进行转码

1.可以用Dreamweaver打开文件,并重新保存,即可以去除BOM标签!

图片 4

2.可以用EditPlus打开文件,并在菜单“首选项”->“文件”->”UTF-8标识”,设置为:“总是删除签名”,然后保存文件,即可以去除BOM标签!

如上图,添加红色框标志的中文转码后,保存,刷新界面,正常显示了。

3.PHP以附件形式保存文件的时候,UTF-8编码问题:
PHP以附件形式保存文件,文件名必须是GB2312编码,否则,如果文件名中有中文的话,将是显示乱码:
如果你的PHP本身是UTF-8编码格式的文件,需要将文件名变量由UTF-8转成GB2312:
iconv(“UTF-8”, “GB2312”, “$filename”);

图片 5

4.截断显示文章标题时,出现乱码或者“?”问号的问题:

 

一般文章标题很长的时候,会显示一部分标题,会对文章标题进行截断,由于一个UTF-8编码格式的中文字符会占用3个字符宽度,截取标题的时候,有时会只截取到一个中文字符的1个字符或2字符宽度,没截取完整,将出现乱码或“?”问号的情况,

 

用下面的函数截取标题,就不会有问题:

如果是“文章管理”的下一级栏目乱码,如图红框部分是乱码显示的情况!@_@~

function get_brief_str($str, $max_length) { 
  echo strlen($str) . ""; 
  if (strlen($str) > $max_length) { 
    $check_num = 0; 
    for ($i = 0; $i < $max_length; $i++) { 
      if (ord($str[$i]) > 128) 
        $check_num++; 
    } 
    if ($check_num % 3 == 0) 
      $str = substr($str, 0, $max_length) . "..."; 
    else 
      if ($check_num % 3 == 1) 
        $str = substr($str, 0, $max_length +2) . "..."; 
      else 
        if ($check_num % 3 == 2) 
          $str = substr($str, 0, $max_length +1) . "..."; 
  } 
  return $str; 
}

图片 6

MYSQL数据库使用UTF-8编码的问题

看下数据库,数据表 ch_category,找到需要进行转码的字段,

1.用phpmyadmin创建数据库和数据表
创建数据库的时候,请将“整理”设置为:“utf8_general_ci”或执行语句:

图片 7

CREATE DATABASE `dbname` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

^_^ 还是进行转码处理!!

创建数据表的时候:如果是该字段是存放中文的话,则需要将“整理”设置为:“utf8_general_ci”,如果该字段是存放英文或数字的话,默认就可以了。

打开 项目名/Admin/Lib/Model/CategoryModel.class.php

相应的SQL语句,例如:

找到下面这个函数:

CREATE TABLE `test` ( 
`id` INT NOT NULL , 
`name` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , 
PRIMARY KEY ( `id` ) 
) ENGINE = MYISAM ;
public function tree($map=array('classpid'=>0),$link='',$selparent=''){}

2.用PHP读写数据库

修改如下:

在连接数据库之后:

public function tree($map=array('classpid'=>0),$link='',$selparent=''){          $return = '';          if($link==''){              if($_REQUEST['cid']!='' || $_REQUEST['cname']!=''){ //附加“清空”按钮                  $return .= '<ul >';                  $return .= '    <li><a     onclick="$(\'#'.$_REQUEST['cid'].'\').val(\'\');$(\'#'.$_REQUEST['cname'].'\').val(\'\');">清空重置</a></li>';                  $return .= '</ul>';              }          }          $list = M('Category')->field('classid,classpid,classtitle,classchild,classarrchildids, classmodule')->where($map)->select();          if($list){              if($link=='info_addview'){                  $return .= '<ul>';              }else{                  $return .= '<ul >';              }              foreach($list as $rs){                  if($rs['classpid']==0){                      if($link=='edit'){                          $strlink =                           '<a   .$rs['classid'].'" target="dialog" width="700" height="550" rel="'.$rs['classid'].'">'.iconv('GBK','UTF-8',$rs['classtitle']).'</a>';                      }elseif($link=='info_addview'){                          $strlink =                           '<a   .$rs['classmodule'].'/index/tid/'.$rs['classid'].'" target="navTab" rel="'.$rs['classmodule'].'">'.iconv('GBK','UTF-8',$rs['classtitle']).'</a>';                                              }else{                          $strlink =                           '<a  '.(($selparent || !$rs['classchild']) ? ' onclick="selectClass(\''.$rs['classid'].'\',\''.iconv('GBK','UTF-8',$rs['classtitle']).'\');"' : '').'>'.iconv('GBK','UTF-8',$rs['classtitle']).'</a>';                      }                                          if($rs['classchild']==0){                          $return .= '<li>'.$strlink.'</li>';                      }else{                          $return .= '<li>'.$strlink;                          $return .= $this->_for_tree($rs['classarrchildids'], $link, $selparent);                          $return .= '</li>';                      }                  }                          }              $return .= '</ul>';          }          return $return;      }
$connection = mysql_connect($host_name, $host_user, $host_pass);

这样就不会出现乱码啦。如果有别的菜单栏目需要转码,也是按照上面的做法,找到相应的代码文件,进行代码修改。

加入两行:

(^_^)~   完~

mysql_query("set character set 'utf8'");//读库 
mysql_query("set names 'utf8'");//写库

就可以正常的读写MYSQL数据库了。

示例二:

php+mysql的utf-8中文乱码问题的解决方法

问题汇总:

1.mysql数据库默认的编码是utf8,如果这种编码与你的PHP网页不一致,可能就会造成MYSQL乱码.

2.MYSQL中创建表时会让你选择一种编码,如果这种编码与你的网页编码不一致,也可能造成MYSQL乱码.

3.MYSQL创建表时添加字段是可以选择编码的,如果这种编码与你的网页编码不一致,也可能造成MYSQL乱码.

相关文章