如何在PHP CURL POST请求中正确发送含法语字符的内容
问题解决:PHP Curl发送法语短信异常
根因说明
你遇到的问题核心是POST参数未做规范URL编码,以及没有保证字符编码全链路一致:
- 法语包含大量非ASCII特殊字符(如é、è、ê等),直接拼接到POST参数字符串中会破坏
x-www-form-urlencoded格式的结构,服务端无法正常解析参数,而纯英文都是ASCII字符,不会触发该问题 - 即使配置了UTF-8的请求头,只要参数本身编码/转义错误,服务端还是会识别异常
修复步骤
- 不要手动拼接POST参数字符串,将参数封装为数组传给
CURLOPT_POSTFIELDS,CURL会自动完成符合规范的URL编码,无需手动处理 - 确认你的PHP源文件以UTF-8无BOM格式保存,保证硬编码的法语文本本身编码正确
- 签名逻辑要和参数编码保持一致,避免服务端签名校验失败
修复后代码
// 推荐用json_encode生成JSON,避免硬写转义符出错 $sms = json_encode([ 'text' => [ 'fr' => 'Bienvenue sur Gamebar! Accédez au service et gérer votre abonnement sur' ] ], JSON_UNESCAPED_UNICODE); $ordered_params = [ 'order' => '112423', 'prompt_content_args' => $sms ]; $to_sign = ''; foreach ($ordered_params as $v) { $to_sign .= $v; } // 仅当你的PHP文件是ISO-8859-1编码时才启用下面这行 // $to_sign = utf8_encode($to_sign); $digest = hash_hmac('sha256', $to_sign, '8awIiFHqV8zlimG'); $curl = curl_init(); // POST参数用数组传递,CURL自动编码 $postFields = [ 'digest' => $digest, 'order' => '112423', 'prompt_content_args' => $sms ]; curl_setopt_array($curl, [ CURLOPT_URL => "https://url.com", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => $postFields, CURLOPT_HTTPHEADER => [ "Content-Type: application/x-www-form-urlencoded; charset=utf-8" ], ]); $result = curl_exec($curl); curl_close($curl);
提示:
json_encode的JSON_UNESCAPED_UNICODE参数可以保留法语等非ASCII字符的原始格式,不需要转义为\uXXXX序列,适配绝大多数服务端的JSON解析规则。
内容的提问来源于stack exchange,提问作者Jay Doshi
相关产品推荐
相关产品推荐

