curl php亂碼是很常見的問題,針對這個問題,我本著分享解決問題的精神,寫下這篇文章。在理解本文之前,你需要知道關于curl和php編程的基礎知識。
在使用curl php時,難免會遇到中文數據傳輸亂碼的問題。例如抓取的頁面內容、post請求的參數、響應結果等。本問題的解決思路有兩大類:
問題出現的原因
亂碼的出現,源于php默認的編碼為ISO-8859-1或WINDOWS-1252。如果服務端沒有做字符集的轉換,返回的數據就會出現亂碼。如果服務端做了UTF-8的編碼,最好也將返回的數據轉換成UTF-8編碼,避免出現亂碼的現象。例如一個簡單的獲取百度首頁的例子:
$url = "http://www.baidu.com"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $data = curl_exec($ch); curl_close($ch); echo $data;
如果沒有特別指定編碼,那么$data中的數據就可能出現亂碼。這是因為curl響應結果的默認編碼是ISO-8859-1或WINDOWS-1252,在傳輸過程中如果有中文字符,它將被轉碼成亂碼。所以如果需要接收UTF-8編碼的數據,我們需要手工將curl的編碼轉成UTF-8編碼,如下:
$url = "http://www.baidu.com"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $data = iconv("gb2312", "utf-8", curl_exec($ch)); // 將編碼轉換成UTF-8 curl_close($ch); echo $data;
上述代碼中,我使用了iconv函數,將默認編碼gb2312轉換成UTF-8編碼,避免出現亂碼的現象。當然,如果你確定響應結果是UTF-8編碼,那么直接輸出即可。
使用mb_convert_encoding函數轉碼
還有一種轉碼的方法,就是使用php的mb_convert_encoding函數,它可以將字符串從一個字符集轉成另一個字符集。該函數的語法如下:
string mb_convert_encoding (string $str, string $to_encoding [, mixed $from_encoding = mb_internal_encoding()])
參數說明:
- str:需要轉碼的字符串。
- to_encodng:目標編碼。
- from_encoding:原編碼,可以省略。
下面我介紹一下使用mb_convert_encoding函數來解決curl php亂碼問題的方法:
$url = "http://www.baidu.com"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $data = curl_exec($ch); $data = mb_convert_encoding($data, "UTF-8", "auto"); // 將編碼轉換成UTF-8 curl_close($ch); echo $data;
上述代碼中,我使用mb_convert_encoding函數將自動檢測字符串的編碼(由auto指定),并將其轉換成UTF-8編碼。
總結
本文介紹了兩種解決curl php亂碼問題的方法,分別是使用iconv函數和使用mb_convert_encoding函數。需要注意的是,在使用這些函數的時候,必須要確定待處理的數據是以哪種編碼進行的存儲,否則轉碼也會出現失敗的情況。
遇到亂碼問題,不要心急,理性分析問題出現的原因,細致思考解決方法。能夠解決問題的方法總是有的,只要用心去尋找,我們總能找到最佳的解決方案。