我正在尝试将javascript片段转换为PHP。Javascript是
var sum1 = 0, sum2 = 0;
for (var i = domain.length - 1; i >= 0; i--) {
sum1 += domain.charCodeAt(i) * 13748600747;
sum2 += domain.charCodeAt(i) * 40216416130;
}
var x = ("$" + sum1).substring(0, 8) + ("" + sum2).substring(0, 8);
但是不能理解这部分,sum1 += domain.charCodeAt(i) * 13748600747;
我的意思是哪个PHP函数可以代替domain.charCodeAt(I)。
我的PHP代码:
$domain = "example.com";
$sum1 = 0;
$sum2 = 0;
$length = strlen($domain);
$i = $length - 1;
for ( $i; $i >= 0; $i-- ) {
$sum1 += ord($domain[$i]) * 13748600747;
$sum2 += ord($domain[$i]) * 40216416130;
}
$newsum = "$".$sum1;
$x = substr($newsum,0,8) + substr($sum2,0,8);
echo $x;
输出肯定不同。需要帮助。
这应该是Unicode安全的版本。
$domain = "example.com";
$sum1 = 0;
$sum2 = 0;
// this will convert $domain to a UTF-16 string,
// without specifying the third parameter, PHP will
// assume the string uses PHP's internal encoding,
// you might want to explicitly set the `from_encoding`
$domain = mb_convert_encoding($domain, 'UTF-16');
$length = mb_strlen($domain, 'UTF-16');
$i = $length - 1;
for ( $i; $i >= 0; $i-- ) {
$char = mb_substr($domain, $i, 1, 'UTF-16');
$sum1 += hexdec(bin2hex($char)) * 13748600747;
$sum2 += hexdec(bin2hex($char)) * 40216416130;
}
$newsum = "$" . strval($sum1);
$sum2 = strval($sum2);
$x = substr($newsum,0,8) . substr($sum2,0,8);
echo $x;
到十进制的转换是基于ord
文档注释中的代码。
因为ord()只适用于ascii,而javascript使用utf-16,所以我们最好使用
hexdec(bin2hex($utf16_char))
这是我做的实验:
// This is a utf8 character because my editor can only accept utf8
$utf8_char = "北";
// convert to utf16 using mb_convert_encoding()
$utf16_char = mb_convert_encoding($utf8_char, "utf-16", "utf-8");
// output is correct: int(21271), same as javascript output
var_dump(hexdec(bin2hex($utf16_char)));
// output is wrong: int(83) because ord() only works for ascii character.
var_dump(ord($utf16_char));
注意:为了完全替换上面的js代码,最好使用mbstring模块,并设置utf-16作为内部编码。
mb_internal_encoding('utf-16');
然后使用mb_*函数,例如,使用mb_strlen()代替strlen()。你也可以为php函数提供utf16字符串。
[UPDATE]为了更好地理解这个问题,请注意以下两行是等价的:
hexdec(bin2hex($any_utf_char));
(int) base_convert(unpack("H*", $any_utf_char)[1], 16, 10); // Note: the array dereferencing only works in php5.4
就是ord
($domain[$i])