这是我的PHP问题:对于与Postfinance集成的E-Payement,我需要验证数据的发送和收到的所有字段的SHA256哈希值,每个字段之间都有一个密钥。
如何在散列之前确定输入字符串是否为UTF8?
命令utf8_encode()用于输入字符串,如果我用mb_check_encoding()检查,它没问题,我有良好的响应,如果我使用mb_detect_encoding(),响应是&# 34; 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"/>
请帮帮我!谢谢!
答案 0 :(得分:0)
以下是一些例子:
$str="éóùùééééè"; // will output 'éóùùééééè'
$strr =utf8_encode($str); // will output 'éóùùééééè'
如果你申请UTF-8字符串,utf8_encode()将返回一个乱码的UTF8输出,如例子所示。
为了确保您使用的是UTF-8,在每个脚本的顶部使用mb_internal_encoding('UTF-8')
,您可以使用此forceutf8类。链接https://github.com/neitanod/forceutf8。
<?php
// Tell PHP that we're using UTF-8 strings until the end of the script
mb_internal_encoding('UTF-8');
include('Encoding.php'); //the class from github
//same strings
$str = 'éóùùééééè';
$str1 = 'éóùùééééè'; //garbled UTF8 of éóùùééééè
//force input to utf8
use \ForceUTF8\Encoding;
echo Encoding::fixUTF8($str).'</br>'; // will output éóùùééééè
echo Encoding::fixUTF8($str1).'</br>'; // will output éóùùééééè
$str3 = Encoding::fixUTF8($str);
$str4 = Encoding::fixUTF8($str1);
//Then hash
$hash1 = hash('sha256', $str3);
$hash1 = hash('sha256', $str4);
echo $hash1; // will output 45b8151559a5136d58f85ebf51c24f26c47e51f4a89fe2962c8626e99ad64786
echo $hash2; // will output 45b8151559a5136d58f85ebf51c24f26c47e51f4a89fe2962c8626e99ad64786
//mb_detect_encoding will ouput always ASCII
echo mb_detect_encoding($hash1). '</br>'; // will output ASCII
echo mb_detect_encoding($hash1); //// will output ASCII
在浏览器级别,您需要:
<meta charset="UTF-8">
答案 1 :(得分:0)
您不应该将值编码为utf8两次。我建议只在真的有必要时进行编码。例如:
if (!mb_check_encoding($pf_string, 'UTF-8')) {
$pf_string = mb_convert_encoding($pf_string, 'UTF-8');
}