PHP将CP1251编码西里尔字符转为UTF-8出现乱码如何解决
问题分析
你使用的转换逻辑本身没有错误,出现乱码的核心原因是:写在PHP源码中的待转换字符串Íó è ÿ ñäåëàëà âûâîäû...已经被编辑器保存为UTF-8编码,并非原始的CP1251字节流。转换函数将UTF-8编码的内容误作为CP1251编码处理,二次编码后就会产生乱码。
解决方案
根据你的使用场景选择对应调整方式:
- 若字符串来自外部CP1251编码的数据源(如CP1251编码的文件、旧接口、历史数据库表)
直接读取数据源的原始字节内容,再调用原有转换逻辑即可正常转换,示例代码:// 读取CP1251编码的文件获取原始字节 $raw_cp1251 = file_get_contents('your_cp1251_file.txt'); // 原有转换逻辑可正常运行 $utf8_str = iconv('CP1251', 'UTF-8', $raw_cp1251); echo $utf8_str; - 若仅需要硬编码测试转换效果
先将写在UTF-8源码中的测试字符串转回CP1251原始字节,再执行转UTF-8的操作即可,示例代码:// 先把UTF-8编码的测试串转为CP1251原始字节 $raw_cp1251 = mb_convert_encoding('Íó è ÿ ñäåëàëà âûâîäû...', 'CP1251', 'UTF-8'); // 执行CP1251到UTF-8的转换 $result = mb_convert_encoding($raw_cp1251, 'UTF-8', 'CP1251'); echo $result; // 输出符合预期:Ну и я сделала выводы... - 额外优化:如果转换过程中存在未识别字符,可以给iconv增加转换参数避免中断报错,
//TRANSLIT表示用近似字符音译替换,//IGNORE表示直接跳过无效字符:$utf8_str = iconv('CP1251', 'UTF-8//TRANSLIT', $raw_cp1251);
内容的提问来源于stack exchange,提问作者Dev0r
相关产品推荐
相关产品推荐

