WordPress 中文乱码之谜终于解开!附 Pre 标签防代码转义方法
昨天晚上遇到一个 WordPress 的问题,折腾了很久很久。就是我想在文章中加入一段 PHP 代码,一般我是用 pre 标签来包括整个代码段的,目的是防止代码转义。但果那段代码就是会转义,于是我查找解决方法。
打开主题的 functions.php 文件,加入:
add_filter( 'the_content', 'pre_content_filter', 0 ); function pre_content_filter( $content ) { return preg_replace_callback( '|<pre.*>(.*)</pre|isU' , 'convert_pre_entities', $content ); } function convert_pre_entities( $matches ) { return str_replace( $matches[1], htmlentities( $matches[1] ), $matches[0] ); }
代码是不会转义了,但是我发现其中的中文全部变成了乱码,如下图:
查看了后台和数据库,都是正常的,显然从数据库到前台显示还有个转码的过程,问题应该就出在这个过程里。后来仔细分析了上面这段代码,发现问题就出在 str_replace 这个函数。str_replace 并不是 WordPress 自定义的函数,是 PHP 自带的,它在中文字符替换方面确实存有问题,会产生乱码,跟字节有关,具体可以搜索一下。
换了其它各种函数,重写代码,结果都失败,搞了很久。后来我把测试环境搬回本地,发现竟然好了!但是在服务器上就是出现中文乱码的情况。后来我意识到,本地和服务器的环境,不同的地方就是 WordPress 版本和 PHP 的版本,两者都有可能。我本地装的是 phpStudy,切换 PHP 版本非常方便,本来是 PHP 7.2.10,切换到 5.6.27 还是正常的,但是切换到 PHP 5.2.17 的时候,本地也报错出现了乱码,所以问题就在于 PHP 版本!所以说,PHP 版本问题对 WordPress 影响还是挺大的。
早上把服务器上的 PHP 版本升级到 7.2.15,一切正常了! 中文乱码问题搞定!效果见:https://ihacksoft.com/446.html
你发的代码就是这样 还是 出现了乱码?
Google Chrome 55.0.2883.87 Windows 7 x64 Edition2019-9-15 10:51:02