首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

PHP cURL 獲取高德 API 返回不全:文件編碼導致中文參數截斷

     編輯:程式設計疑難解答

現象

瀏覽器直接訪問高德 Geocoding API 返回完整 JSON(含 `geocodes` 數組),但 PHP cURL 獲取返回 `count:0, geocodes:[]`。

代碼片段

$requesturl = "https://restapi.amap.com/v3/geocode/geo?address=北京市朝陽區阜通東大街6號&output=json&key=...";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $requesturl);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$info = curl_exec($ch);
curl_close($ch);
echo json_decode($info, true);

根本原因

PHP 源文件編碼為 GBK/GB2312,而 URL 中的中文參數 `address=北京市...` 以文件編碼形式嵌入。高德 API 要求 UTF-8 編碼的 URL 參數。GBK 編碼的中文在 URL 中會被誤解析,導致地址解析失敗,返回空結果。

解決方案

  1. 將 PHP 文件保存為 UTF-8 無 BOM 編碼(編輯器如 VS Code、PhpStorm、Notepad++ 可在右下角或菜單轉換)。
  2. 或在代碼中顯式編碼:
    $address = urlencode("北京市朝陽區阜通東大街6號"); // 確保字符串為 UTF-8
    $requesturl = "https://restapi.amap.com/v3/geocode/geo?address=$address&output=json&key=...";
  3. 確保 `php.ini` 中 `default_charset = "UTF-8"`。

驗證方法

在代碼中 `var_dump($requesturl);` 檢查實際請求 URL 中文部分是否為 `%E5%8C%97%E4%BA%AC...`(UTF-8 URL 編碼)而非 `%B1%B1%BE%A9...`(GBK 編碼)。

總結

中文參數 API 請求務必保證:源文件 UTF-8、字符串 UTF-8、URL 編碼 UTF-8。編碼不一致是「瀏覽器正常、代碼異常」的最常見原因。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved