当我在浏览器中输入字符串
DIN 2080 Fräseraufnahmen SK 30
时,它会将其编码为 DIN%202080%20Fr%C3%A4seraufnahmen%20SK%2030
,并且 API 可以正确读取它。但是,在调用相同 API 的 PHP 脚本中,当我使用函数 rawurlencode()
对字符串进行编码时,它被编码为 DIN%202080%20Fra%CC%88seraufnahmen%20SK%2030
。这会导致相同的 API 将字符串错误地识别为不匹配。如何在 PHP 中对字符串进行编码,使其与浏览器编码的字符串相同?
浏览器:
DIN%202080%20Fr%C3%A4seraufnahmen%20SK%2030
PHP
rawurlencode()
:
DIN%202080%20Fra%CC%88seraufnahmen%20SK%2030
附录: 经过进一步检查,发现问题是由于php Composer的autoloader引起的。然而,Sitethief 的答案解决了这个问题。
测试程序:
<?php
require_once(__DIR__ . '/vendor/autoload.php');
echo '<pre>' . rawurlencode($_GET['a']) . '</pre>';
echo '<br />';
echo '<pre>' . rawurlencode(Normalizer::normalize($_GET['a'], Normalizer::FORM_C)) . '</pre>';
脚本称为
/test.php?a=ä
输出:
a%CC%88
%C3%A4
您可以使用 PHP Normalizer 类使用与浏览器使用的相同规范化形式来转换字符串。不过,您确实需要安装
intl
PHP 扩展才能正常工作。
这应该是这样的:
$normalizedString = Normalizer::normalize($inputString, Normalizer::FORM_C);
您可以尝试用“%20”替换空格以获得相同的输出:
$encodedString = str_replace(" ", "%20", rawurlencode($string));