乱码问题
数据库的编码一般是不能变的, 已存在的数据库里面数据是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) |