【发布时间】:2019-07-08 20:35:01
【问题描述】:
这是我使用 PHP 的问题:对于与 Postfinance 的电子支付集成,我需要使用所有字段的 SHA-256 哈希验证发送和接收的数据,每个字段之间都有一个密钥。
如何确定输入字符串在散列之前是 UTF-8 格式?
命令utf8_encode() 用于输入字符串,如果我用mb_check_encoding() 进行检查,就可以了。我有很好的响应,如果我使用 mb_detect_encoding(),响应是“ASCII”。
$pf_post = array();
$pf_post['AMOUNT'] = 100;
$pf_post['CURRENCY'] = "CHF";
$pf_post['ORDERID'] = 101;
$pf_post['TITLE'] = "Paiement";
$pf_key = "mytestkey";
foreach (array_keys($pf_post) as $lakey)
{
$pf_string .= strtoupper($lakey) . "=" . strval($pf_post[$lakey]) . $pf_key;
}
$pf_string = utf8_encode($pf_string);
$pf_sign = hash('sha256',$pf_string);
if (mb_check_encoding($pf_string, 'UTF-8')) {
$debug .= "STRING => Détection UTF8 OK !<br>";
}
else {
$debug .= "STRING => Détection UTF8 !!! ERREUR !!!<br>";
}
if (mb_check_encoding($pf_sign, 'UTF-8')) {
$debug .= "HASH => Détection UTF8 OK !<br>";
}
else {
$debug .= "HASH => Détection UTF8 !!! ERREUR !!!<br>";
}
$debug .= "String Format: " . mb_detect_encoding($pf_string) .
", Hash Format: " . mb_detect_encoding($pf_sign) . "<br>";
这是调试:
STRING => Détection UTF8 OK !
HASH => Détection UTF8 OK !
String Format : ASCII, Hash Format : ASCII
如果我在字段中只使用数字,那没关系……如果我使用字母,那不是每次都可以……如果使用带重音的字母……任何时候都是错误的!
在 HTML 标头中,我有:
<meta charset="utf-8"/>
我该如何解决这个问题?
【问题讨论】:
-
嗨!你试过这个吗? stackoverflow.com/a/1037368/1461181
-
“命令 utf8_encode() 用于输入字符串” - 为什么,它已经不是 UTF-8 了?我们在这里谈论的是表单数据,对吧?您的页面已经采用 UTF-8 格式,那么您是如何设法让表单数据一开始就以 UTF-8 格式发送not?
-
或者您只是在谈论这里的
$pf_post数据?如果那不是 UTF-8,则意味着您没有将脚本文件本身保存为 UTF-8 - 所以 that 将是您需要更正的东西,而不是在运行时弄乱编码。 .. -
utf8_encode()== 你的输入字符串确定是onlyISO-8859-1类型吗? -
感谢您的帮助!!!