您在這裡

一種疑難的漢字網址編碼錯誤和解決辦法

James Qi 在 2023年2月20日 - 00:26 發表

漢字網址編碼錯誤 ISO-8859-1,GBK,UTF-8

以前寫過幾篇關于漢字網址編碼錯誤和解決辦法的博客,解決了我們一些網站中發現的報錯,這些基本上都是因為某些搜索引擎或者爬蟲程序對漢字的編碼識别和處理錯誤造成的。

但依然有一種錯誤情況我們始終沒有找到規律,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跳轉到正确的網址
}
?>

上面這段代碼也可以考慮寫成通用的函數,在需要的地方調用。

發表新回應

Plain text

  • 不允許使用 HTML 標籤。
  • 自動將網址與電子郵件地址轉變為連結。
  • 自動斷行和分段。