本地WAMP与生产环境MySQL编码不一致致字符显示异常
编码不一致问题:本地WAMP需utf8_decode,生产环境无需
本地使用WAMP开发环境,生产环境部署在服务商服务器上。为测试需求,将生产环境数据库导出后导入本地WAMP环境。现有一个从数据库读取文本并生成JSON文件用于展示的函数,在WAMP环境中必须使用utf8_decode才能正常显示带重音的字符,但生产环境无需使用。两边导入的是同一SQL文件,已检查所有编码相关配置,问题仍存在。
环境配置对比
| 参数 | 开发环境 | 生产环境 |
|---|---|---|
| phpMyAdmin版本 | 5.2.0 | 5.2.1 |
| 导出SQL文件编码 | NA | utf-8 |
| 导出SQL参数 | (从生产环境导入) | 数据&结构(含删除) |
| 导入SQL文件编码 | utf-8 | NA |
| 数据库排序规则 | latin1_swedish_ci | latin1_swedish_ci |
| 字段排序规则 | latin1_swedish_ci | latin1_swedish_ci |
| MySQL版本 | 8.0.31 | ??? |
| PHP版本 | 8.0.26 | 8.0.28 |
| PHP配置default_charset | UTF-8 / UTF-8 | UTF-8 / UTF-8 |
| Web服务器 | Apache/2.4.54 | Apache ??? |
测试结果
不使用utf8_decode时
代码片段:
"content": "'.(str_replace($badchar, '',str_replace(array("\r\n","\r","\n"),'<br/>', $data['avis']))).'"
- 开发环境显示:
"Région riche en découvertes." - 生产环境显示:
"Région riche en découvertes."
使用utf8_decode时
代码片段:
"content": "'.utf8_decode(str_replace($badchar, '',str_replace(array("\r\n","\r","\n"),'<br/>', $data['avis']))).'"
- 开发环境显示:
"Région riche en découvertes." - 生产环境显示:
"R�gion riche en d�couvertes."
疑问
不清楚问题出在Apache、MySQL还是PHP?两边调用mb_detect_encoding函数均返回UTF-8。
完整函数代码
function refresh_json_avis($BDD) { $badchar=array( // 控制字符 chr(0), chr(1), chr(2), chr(3), chr(4), chr(5), chr(6), chr(7), chr(8), chr(9), chr(10), chr(11), chr(12), chr(13), chr(14), chr(15), chr(16), chr(17), chr(18), chr(19), chr(20), chr(21), chr(22), chr(23), chr(24), chr(25), chr(26), chr(27), chr(28), chr(29), chr(30), chr(31), // 不可打印字符 chr(127) ); $SiteDataClass = new SiteDataClass($_SERVER['DOCUMENT_ROOT']."/json/config.json"); $req =$BDD->prepare('select avis, nom, date, appartement FROM reservations WHERE etat>=6 AND avis!="" ORDER BY date DESC, id DESC'); $req->execute(); $file='['; while($data = $req->fetch()) { $array_date=explode('-',$data['date']); $file.='{"title": "'.$SiteDataClass->get_flat_name($data['appartement']).', '.$array_date[2].'/'.$array_date[1].'/'.$array_date[0].'","content": "'.utf8_decode(str_replace($badchar, '',str_replace(array("\r\n","\r","\n"),'<br/>', $data['avis']))).'","sign": "'.strtoupper(substr($data['avis'], 0, 1)).'."},'; } $req->closecursor(); $file = rtrim($file); $file = rtrim($file, ","); $file.= "]"; file_put_contents($_SERVER['DOCUMENT_ROOT'].'/json/avis.json', $file); return('[{"type":"message","content":"'.mb_detect_encoding($file).'","param":"success"}]'); //调试用 return('[{"type":"message","content":"Mis à jour, cela peut mettre plusieurs minutes à apparaitre","param":"success"}]'); }
内容的提问来源于Stack Exchange,提问作者Etr
相关产品推荐
相关产品推荐

