Почему результат от ord PHP не такой же, как результат от charCodeAt javascript?

Почему результат от ord PHP не такой же, как результат от charCodeAt javascript ?

Результат от PHP 230 143 144

И результат от javascript 25552

Как применить php код, чтобы получить результат, такой же, как результат javascript ?

.

.

Яваскрипт

<script>
var someString = "提";

for(var i=0;i<someString.length;i++) {
    var char = someString.charCodeAt(i);
    alert(char);
}
</script>

РНР

<?php
$s = '提';

for ( $i = 0; $i < strlen( $s ); $i++ ) {
    print ord( $s[ $i ] ) . "n";
}
?>

1 ответ

  1. Потому что существует около сотни различных способов кодирования текста в компьютере. Вдобавок:

    • PHP действительно не знает, что кодирование данных используется
    • JavaScript на самом деле не реализовал Unicode правильно до последних версий (хотя это не актуально в данном конкретном случае)

    Ваш символ (提) указан в каталоге Unicode как ‘hold in hand; lift in hand’ (U+63D0) и имеет, среди многих других, следующие кодировки:

    • AS UTF-8: 0xE6 0x8F 0x90
    • Как UTF-16: 0x63D0(25552в десятичном формате)

    Ваш PHP файл кажется сохраненным как UTF-8 (это то, что вы можете проверить в своем текстовом редакторе), таким образом, 提 кодируется в трех байтах, но ваш код разделяет один символ на отдельные байты.

    Ваша функция JavaScript, однако, печатает кодировку UTF-16 как задокументировано .

    PHP предоставляет несколько встроенных функций для преобразования между кодировками:

    $as_utf8 = '提';
    var_dump( unpack('n', mb_convert_encoding($as_utf8, 'UTF-16BE', 'UTF-8')) );
    var_dump( unpack('n', iconv('UTF-8', 'UTF-16BE', $as_utf8)) );