Почему не работает в PHP?
Почему этот код нормально работает в JS
function encrypt(text, num) {
let encrypted_text = '';
for (const symbol of text.toString()) {
encrypted_text += String.fromCharCode(symbol.charCodeAt(0) + num);
}
return encrypted_text;
}
function decrypt(encrypted_text, num) {
let decrypted_text = '';
for (const symbol of encrypted_text) {
decrypted_text += String.fromCharCode(symbol.charCodeAt(0) - num);
}
return decrypted_text;
}
console.log(decrypt(encrypt('Hello World!', 1000000, 1000000)));
А этот в PHP нет?
class Encryption
{
const DEFAULT_NUMBER= 1000000;
const ENCODING = 'UTF-16';
public static function encrypt($text, $num) {
$text = strval($text);
$encrypted_text = '';
foreach (str_split($text) as $symbol) {
$encrypted_text .= mb_chr(mb_ord($symbol, self::ENCODING) + $num, self::ENCODING);
}
return base64_encode($encrypted_text);
}
public static function decrypt($encrypted_text, $num) {
$encrypted_text = base64_decode($encrypted_text);
$decrypted_text = '';
foreach (str_split($encrypted_text) as $symbol) {
$decrypted_text .= mb_chr(mb_ord($symbol, self::ENCODING) - $num, self::ENCODING);
}
return $decrypted_text;
}
}
$enc = \App\Encryption\Encryption::encrypt('Hello World!', 1000000);
$dec = \App\Encryption\Encryption::decrypt($enc, 1000000);
var_dump($enc, $dec);
Результат PHP кода:
C:\wamp64\www\test.local\routes\web.php:49:string '25DeQNuQ3kDbkN5A25DeQNuQ3kDbkN5A25DeQNuQ3kDbkN5A25DeQNuQ3kDbkN5A' (length=64)
C:\wamp64\www\test.local\routes\web.php:49:string '' (length=0)
Ответы (1 шт):
Автор решения: lezhni
→ Ссылка
Проблема возникает из-за того, что str_split при работе с многобайтовой кодировкой разбивает строку не на символы, а на байты. В качестве решения нужно использовать mb_str_split вместо str_split