Chinaunix首页 | 论坛 | 博客
  • 博客访问: 543191
  • 博文数量: 119
  • 博客积分: 3167
  • 博客等级: 中校
  • 技术积分: 1215
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-20 21:21
文章分类

全部博文(119)

文章存档

2015年(21)

2012年(4)

2011年(1)

2007年(11)

2006年(50)

2005年(32)

分类: PHP

2015-09-11 17:51:26

乱码问题


数据库的编码一般是不能变的, 已存在的数据库里面数据是GB2312字符集, 因此配置文件中定义 databaseCharset' => 'gb2312',


PHP 代码文件因为如果是utf8字符集,进行匹配查找的时候中文会有问题,当然还有其他地方读写数据库数据中文下标的都可能有问题


FLEAPHP中配置文件中可以定义responseCharset , 这个定义为gb2312的话, 那么即使你的模板文件是utf8的, 也会给你按gb2312来输出
也就是说浏览器是听从配置文件里的responseCharset的字符集, 如果你的网页模板是utf8字符集编写,responseCharset是GB2312而那么很不幸中文会乱码的。 
而数据库的字符集是gb2312 , 也就是说读取的数据都是gb2312,当然responseCharset应该用gb2312   那网页也应该用gb2312字符集来编写




当数据库是GB2312字符集,而且还有中文字段名, PHP代码是UTF8的时候


$ret = $this-> _tbMaintain -> find(array('联系电话'=>"13631499573"));
dump($ret);


错误如下:


SQL 閿欒?娑堟伅: "列名 '鑱旂郴鐢佃瘽' 无效。" SQL 璇?彞: "SELECT TOP 1 maintain.* FROM maintain WHERE 


因php文件UTF8,中文列名乱码提示这个列名无效, 


需要把这个列名转换成GB  那么还是可以运行的,只是每次都这样很麻烦


$field = $this->get_utf8_to_gb('联系电话');
$ret = $this-> _tbMaintain -> find(array("$field"=>"13631499573"));
dump($ret);




如果是从GB2312的网页POST得到的数据也是GB2312字符集, 都是服从PHP页面输出设置的字符集,也就是responseCharset


代码已经是UTF8实在没办法的话,那么就只有在PHP文件尽量不用中文,需要显式和数据库通信的时候, 需要对字符串转换成GB字符集


比如上面需要匹配的时候 , 但这种情况还是太麻烦了,比如从数据数组的下标如果是中文的,
而需要写入数据库的时候,岂不是所有下标都要转换??? 当然如果是英文下标那么就不需要转换了。
或者PHP代码文件本身是GB2312也不用麻烦, 但就是有时候会遇到不少中文字段名




如果代码不是很多的话,数据库是GB2312\GBK的话, 还是直接把代码全改成数据库一致的字符集吧




还有GB2312字符集的数据库, smarty模板中下标不能用中文,比如: <{$maintain.报修日期}> 
即使是PHP页面和模板文件都是用的GB2312,
而且参考smarty官网设置编码也不行(这段代码加在view/smarty.php文件的最前)




Example 11.1. 设置字符集编码




// 使用日文字符集编码
if (function_exists('mb_internal_charset')) {
  mb_internal_charset('GB2312');
}
define('SMARTY_RESOURCE_CHAR_SET', 'GB2312');
require_once 'libs/Smarty.class.php';
$smarty = new Smarty();
  
如果是utf8字符集的数据库?现存的数据库因为数据都是来自EXCEL VBA 所以在没有关注数据库字符集的时候,从VBA里面把数据从EXCEL插入SQL SERVER 都成了GB2312
主要原因是EXCLE是中文版的EXCEL 中文版的操作系统 , 于是这些都默认GB2312


于是模板中访问中文下标的话, 只能在php文件里给模板变量赋值前,全部改下标了, 用数组MAP一下, 每张表都需要对字段名这么中文英文MAP操作一下
阅读(1529) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~