这个问题在这里已有答案:
http_build_query
功能有奇怪的行为。排列
Array
(
[merchant_id] => 2005197514857165061
[merchant_site_id] => 144033
[currency] => USD
[total_amount] => 1
)
它转换为
merchant_id=2005197514857165061&merchant_site_id=144033¤cy=USD&total_amount=1
如你所见,它代替currency
编码为¤cy
根据要求编辑代码
$postData['merchant_id'] = $this->merchant_id;
$postData['merchant_site_id'] = $this->merchant_site_id;
$postData['currency'] = $transaction['currency'];
$postData['total_amount'] = $transaction['amount'];
var_dump($postData);
var_dump(http_build_query($postData));
和输出
array(4) { ["merchant_id"]=> string(19) "2005197514857165061" ["merchant_site_id"]=> string(6) "144033" ["currency"]=> string(3) "USD" ["total_amount"]=> string(1) "1" } string(83) "merchant_id=2005197514857165061&merchant_site_id=144033¤cy=USD&total_amount=1"
你得到83个字节:
string(83) "merchant_id=2005197514857165061&merchant_site_id=144033¤cy=USD&total_amount=1"
但是,显示的字符串只有77个字符,其中大多数可以安全地假设为单字节。这意味着你实际上得到currency
而不是¤cy
。因此,无关的¤
符号必须是一些进一步后处理的结果。
var_dump()
输出包含换行符并且您在一行中共享它,这表明您不是在查看生成的HTML代码,而是查看渲染的视图。在HTML中,¤
可以编码为¤
实体。
出于某种原因,该实体似乎与其他实体的处理方式不同:
<p>¤cy / ¤cy</p>
<p>€pe / &europe</p>
因此,如果您在HTML中注入URL,请确保对其进行编码:
echo htmlspecialchars(http_build_query($postData));
发生的变化是,当您进行转换时,只会影响它在HTML中的时间,因为浏览器会将其解释为当前的实体。
如果你通过终端进行,它会抛出预期的结果,但如果你通过浏览器这样做,它确实会向你抛出符号。
你有2个选择:
1 - 您可以更改索引的名称,并以另一种方式在文件中接收它。
2 - 您可以以相同的方式发送它,无论发生什么,PHP都会以正确的方式解释它。
阅读此How to get ¤ to display literally, not as an HTML entity