CodeIgniter开发PHP应用:MSSQL(Latin1)与UTF-8字符乱码问题求助
解决CodeIgniter中MSSQL拉丁字符显示黑钻石的问题
嘿,我来帮你搞定这个拉丁字符显示成黑钻石(�)的问题!这种情况基本都是编码不匹配搞的鬼——你的只读MSSQL是Latin1编码,却用UTF-8的连接配置去拉数据,自然会出现乱码。而且数据库只读改不了,那咱们就从应用层入手解决:
1. 修正MSSQL的数据库连接配置
首先得让CodeIgniter用数据库原生的编码去连接,别强行用UTF-8。把你这个MSSQL连接的配置改成这样:
$db['mssql'] = array( 'dbdriver' => 'mssql', 'char_set' => 'latin1', // 改成数据库原生的Latin1编码 'dbcollat' => 'SQL_Latin1_General_CP1_CI_AS', // 对应数据库的排序规则 // 其他配置(主机、用户名、密码等)保持不变 );
这样连接时会直接读取Latin1编码的原始数据,避免连接层错误的编码转换。
2. 把Latin1数据转成UTF-8
拿到原始的Latin1数据后,再转成UTF-8就能正常显示了。你可以在获取查询结果后手动转码:
- 单条数据转码:
$query = $this->db->get('your_table'); $row = $query->row(); // 把需要转换的字段从Latin1转成UTF-8 $row->your_column = mb_convert_encoding($row->your_column, 'UTF-8', 'ISO-8859-1');
- 批量结果转码:
$results = $this->db->get('your_table')->result(); foreach ($results as &$row) { // 遍历所有需要转换的字段 $row->column1 = mb_convert_encoding($row->column1, 'UTF-8', 'ISO-8859-1'); $row->column2 = mb_convert_encoding($row->column2, 'UTF-8', 'ISO-8859-1'); }
如果你的PHP环境没有mbstring扩展,也可以用iconv()替代:
$utf8_string = iconv('ISO-8859-1', 'UTF-8//TRANSLIT', $latin1_string);
//TRANSLIT参数还能把一些无法直接转换的字符转成近似的UTF-8字符,避免丢失内容。
3. 确保全局编码一致
- 检查PHP的编码设置:要么在
php.ini里把default_charset设为UTF-8,要么在CodeIgniter的入口文件里加一句:
ini_set('default_charset', 'UTF-8');
- 页面HTML头部一定要加上编码声明:
<meta charset="UTF-8">
这样浏览器才会用UTF-8解析页面内容。
4. 可选:封装全局转码逻辑
如果很多地方都要处理MSSQL的数据,可以在CodeIgniter里写一个基础模型,让所有操作MSSQL的模型都继承它,在获取结果后自动完成转码。比如:
class Mssql_base_model extends CI_Model { public function get($table) { $results = parent::get($table)->result(); // 批量转码逻辑 foreach ($results as &$row) { foreach ($row as &$value) { if (is_string($value)) { $value = mb_convert_encoding($value, 'UTF-8', 'ISO-8859-1'); } } } return $results; } }
这样就不用每次都手动写转码代码了,省心很多。
原理很简单:先以数据库原生的Latin1编码拿到正确的字节数据,再转换成UTF-8适配你的应用和页面,就能彻底解决黑钻石的问题啦!
内容的提问来源于stack exchange,提问作者Matheus Mannes
相关产品推荐
相关产品推荐

