JSONP 回傳格式為 callback('json string');,若 JSON 字串內含單引號,會導致 JavaScript 解析錯誤。PHP 提供兩種標準解決方案。
<?php
$result = ["msg" => "It's a test"]; // 含單引號
$ret = json_encode($result, JSON_HEX_APOS); // 將 ' 轉為 \u0027
header('Content-Type: text/javascript; charset=utf-8');
echo $callback . '(\'' . $ret . '\');';
// 輸出:callback('{"msg":"It\u0027s a test"}');
JSON_HEX_APOS 為 PHP 5.3+ 內建常數,專門處理此情境,安全可靠。
<?php
$jsonData = "{'msg': \"It's a test\"}"; // 手工拼接的 JSON 字串
$jsonData = preg_replace('/\'/', '\u0027', $jsonData);
echo $callback . '(\'' . $jsonData . '\');';
\u0027 是 Unicode 碼位表示單引號,JSON 解析器可正確還原。JSON.parse() 或 jQuery 自動處理時均能正確還原為單引號。<?php
$callback = $_GET['callback'] ?? 'callback';
$data = ['status' => 'ok', 'info' => "User's data"];
$json = json_encode($data, JSON_HEX_APOS | JSON_UNESCAPED_UNICODE);
header('Content-Type: application/javascript; charset=utf-8');
echo "{$callback}({$json});";