Отличается ли кодировка символов в Javascript и PHP? - PullRequest
2 голосов
/ 14 декабря 2011

Мне нужно сгенерировать «случайный» 128-байтовый ключ (сила случайности в данный момент не важна).Я делаю это в Javascript со следующим кодом:

var buffer = "";
for(var i=0; i<128; i++)
{
    buffer += String.fromCharCode(Math.round(Math.random()*255));
}

Однако, когда я отправляю этот ключ в скрипт PHP через POST, я обнаруживаю, что некоторые символы в моем ключе не имеют одинаковую кодировку!Например, когда я вывожу кодировку в Javascript, я получу 254, но тот же символ имеет кодировку 195 в PHP.

Определенные символы, такие как AZ, az и 0-9, имеют одинаковую кодировку как в Javascript, так и в PHP.

Для вывода кодов символов я использую метод Javascript .charCodeAt () и PHPФункция ord ().

Я надеялся, что кто-нибудь сможет объяснить мне, почему кодировки символов отличаются.Спасибо!

1 Ответ

7 голосов
/ 14 декабря 2011

Javascripts .charCodeAt() возвращает кодовую точку Unicode для каждого строкового символа. Строки в Javascript используют UCS-2 или UTF-16.

С другой стороны, PHP обрабатывает только строки как потоки байтов. Он не знает много кодировок на самом деле. В основном он рассматривает строки ASCII или Latin-1 по умолчанию. (Это бинарно-безопасный по крайней мере.)

Теперь параметры, передаваемые через URL или значения формы, обычно кодируются как UTF-8. Это будет работать в PHP, поскольку UTF-8 был специально разработан для работы с системами, которые не знают о его существовании.

Кодировка UTF-8 ò равна "\xC3\xB2". Поэтому, когда вы получаете доступ к первому символу в PHP с помощью $string[0], он будет видеть только первый байт, который является шестнадцатеричным C3 или десятичным 195.

В PHP есть функции mb_string, однако они могут работать с UTF-8 и т. Д., Если вам это нужно. (Обходной путь здесь состоит в том, чтобы преобразовать строку из UTF-8 в UCS-2 и затем извлечь первое слово , чтобы получить кодовую точку Unicode. данный символ в строке utf-8? )

...