PHP rawurlencode 函数的编码方式与浏览器不同

问题描述 投票:0回答:3

当我在浏览器中输入字符串

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 encoding composer-php autoload
3个回答
2
投票

您可以使用 PHP Normalizer 类使用与浏览器使用的相同规范化形式来转换字符串。不过,您确实需要安装

intl
PHP 扩展才能正常工作。

这应该是这样的:

$normalizedString = Normalizer::normalize($inputString, Normalizer::FORM_C);

-1
投票

您可以尝试用“%20”替换空格以获得相同的输出:

$encodedString = str_replace(" ", "%20", rawurlencode($string));

-2
投票

根据我的经验,似乎编辑器(vscode...)的字符集有问题。

检查编辑器字符集是否为UTF-8。

祝你好运。

enter image description here

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.