(1)thinkphp mssql中文乱码
(2)auto_charset()
(3)参考: http://www.lhcom.cn/html/blog/7/6010.htm (ThinkPHP从Mssql中查询中文乱码解决)
项目的各环节编码如下:
1.因为ThinkPHP默认为UTF-8
2.ThinkPHP的模板文件使用的编码也是UTF-8
3.但smsql数据库是简体中文版,存储的是GB2312编码
根据这些可以分析出乱码是因为编码不一致导致的。现在就是要将从数据库中取出的结果从GB2312转为UTF-8即可。
查询了TP的手册发现其有个内置的函数auto_charset。
在DbMssql类中的getAll方法中将代码:
$result[] = $row;
改为:
$result[] = auto_charset($row, gb2312, utf8)
(4)参考 :http://www.thinkphp.cn/topic/4396.html
/**
*实现字符串编码格式实现转换 */
function auto_charset($fContents,$from='',$to=''){
if(empty($from)) $from = C('TEMPLATE_CHARSET');
if(empty($to)) $to = C('OUTPUT_CHARSET');
$from = strtoupper($from)=='UTF8'? 'utf-8':$from;
$to = strtoupper($to)=='UTF8'? 'utf-8':$to;
if( strtoupper($from) === strtoupper($to) || empty($fContents) || (is_scalar($fContents) && !is_string($fContents)) ){
//如果编码相同或者非字符串标量则不转换
return $fContents;
}
if(is_string($fContents) ) {
if(function_exists('mb_convert_encoding')){
return mb_convert_encoding ($fContents, $to, $from);
}elseif(function_exists('iconv')){
return iconv($from,$to,$fContents);
}else{
halt(L('_NO_AUTO_CHARSET_'));
return $fContents;
}
}
elseif(is_array($fContents)){
foreach ( $fContents as $key => $val ) {
$_key = auto_charset($key,$from,$to);
$fContents[$_key] = auto_charset($val,$from,$to);
if($key != $_key ) {
unset($fContents[$key]);
}
}
return $fContents;
}
elseif(is_object($fContents)) {
$vars = get_object_vars($fContents);
foreach($vars as $key=>$val) {
$fContents->$key = auto_charset($val,$from,$to);
}
return $fContents;
}
else{
//halt('系统不支持对'.gettype($fContents).'类型的编码转换!');
return $fContents;
}
}