
以前写过几篇关于汉字网址编码错误和解决办法的博客,解决了我们一些网站中发现的报错,这些基本上都是因为某些搜索引擎或者爬虫程序对汉字的编码识别和处理错误造成的。
但依然有一种错误情况我们始终没有找到规律,URL中包含类似这样的编码:%C2%B1%C3%9C%C3%88%C3%BD%C3%89%C3%A1,更多截图如下:

我使用我们自己的乱码词典来尝试,没有解决,也写过专门的PHP转换程序(使用各种编码和iconv函数、mb_convert_encoding函数)来尝试,也没有解决。
周末花了半天多的时间来查找资料和尝试,在使用这个乱码恢复工具的时候,总算是看到了乱码“±ÜÈýÉá”转为正常汉字“避三舍”,对应的编码分别为iso-8859-1和GBK,但直接用函数转换还是不行,另外找到这篇文章《PHP 中文转iso8859-1_如何解决php iso 8859 1乱码问题》,终于是找到解决办法了!代码如下:
<?php
/**
* Views找不到结果时的处理程序
* James Qi 2023-2-18
* 判断是否错误的编码,如果是错误的编码就转为正确的编码并跳转,如果不是错误的编码就显示404
* 错误:ISO-8859-1
* https://chengyu.18dao.net/chengyu/%C2%B1%C3%9C%C3%88%C3%BD%C3%89%C3%A1 (URL解码后为:±ÜÈýÉá)
* 正确:GBK
* https://chengyu.18dao.net/chengyu/%E9%81%BF%E4%B8%89%E8%88%8D (URL解码后为:避三舍)
*/
$str0 = $view->args[0];//获取变量
$str1 = iconv("UTF-8", "ISO-8859-1//IGNORE", $str0);//第一次转码,"UTF-8"转"ISO-8859-1"
$str2 = iconv("GBK", "UTF-8//IGNORE", $str1);//第二次转码,"GBK"转"UTF-8"
/** 或者用下面两行来转换
$str1 = mb_convert_encoding($str0, "ISO-8859-1", "UTF-8");//第一次转码,"UTF-8"转"ISO-8859-1"
$str2 = mb_convert_encoding($str1, "UTF-8", "GBK");//第二次转码,"GBK"转"UTF-8"
*/
$chengyu_link = chengyu_link($str2);//转为<a>链接,在这里实际起判断是否为成语使用
if ($chengyu_link == NULL) {//如果不是成语
drupal_not_found();//显示404
drupal_exit();
} else {//如果是成语
$chengyu_url = url("chengyu/$str2", array('absolute' => TRUE));//转换绝对地址
drupal_goto($chengyu_url, array(), 301);//进行301跳转到正确的网址
}
?>
上面这段代码也可以考虑写成通用的函数,在需要的地方调用。
评论