Symfony 4 民族字符显示为?问题求助(原MySQL utf8库)
作为常年跟字符编码打交道的开发者,我来给你捋几个大概率能解决问题的思路,按优先级来:
先把Doctrine的数据库连接编码配置补全
你说改了mysqli驱动并替换了utf8mb4,但可能漏了关键的连接参数。打开config/packages/doctrine.yaml,确保DBAL部分的配置是这样的:doctrine: dbal: driver: 'mysqli' url: '%env(resolve:DATABASE_URL)%' charset: utf8 default_table_options: charset: utf8 collate: utf8_general_ci另外务必检查
.env文件里的DATABASE_URL,如果里面带了charset=utf8mb4这种参数,会覆盖yaml里的配置,得把它改成charset=utf8或者直接删掉这个参数。验证数据库和字段的实际编码
别光凭记忆,实际查一下你的表和字段编码是不是真的是utf8和utf8_general_ci。登录MySQL客户端,执行:SHOW CREATE TABLE your_target_table;看输出里的
ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci,还有每个字段的COLLATE属性。如果有字段用了其他编码,比如latin1,就会导致字符显示成问号,得用ALTER语句修改:ALTER TABLE your_target_table MODIFY COLUMN problematic_column VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci;确保页面输出的编码是UTF-8
即使后端配置对了,前端编码不对也白搭。先确认Twig模板里加了<meta charset="UTF-8">,然后在Symfony的config/packages/framework.yaml里加上默认编码配置:framework: # 其他配置... charset: UTF-8这样Symfony会自动在响应头里加上
Content-Type: text/html; charset=UTF-8,避免浏览器用错误的编码解析页面。检查数据本身是否损坏
直接在MySQL客户端里查询那条带ń的记录,如果客户端里显示的也是问号,那说明数据在迁移过程中已经损坏了(比如从CakePHP导出时编码设置错误)。这时候得重新导出导入数据,导出时要明确指定UTF-8编码。最后确认PHP的默认编码
虽然现在大部分环境默认都是UTF-8,但还是排查一下:在Symfony里写个简单的控制器方法,输出echo ini_get('default_charset');,如果显示不是UTF-8,就去修改php.ini里的default_charset = "UTF-8",重启PHP服务。
内容的提问来源于stack exchange,提问作者Jakub Mańkowski

