2011-12-14 2 views
2

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

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

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

Некоторые символы, такие как A-Z, a-z и 0-9, имеют одинаковую кодировку как в Javascript, так и в PHP.

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

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

+0

Если вам не нужно 255 различных символов , '127' должно быть проще всего работать из-за представления PHP о символах как байтах. – alex

ответ

7

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], он будет видеть только первый байт, который равен hex C3 или десятичному 195.

В PHP есть функции mb_string, но для работы с UTF-8 и т. Д., Если вам это нужно. (Обходной здесь, чтобы преобразовать строку из UTF-8 в UCS-2, а затем извлечь первый слово, чтобы получить точку кода Unicode. Или longwinded подходы, как How to get code point number for a given character in a utf-8 string?)

+1

Блестящий ответ. – alex

+0

Лучшая часть, я узнал, что все на SO. – mario

+0

Забыл поблагодарить вас за этот замечательный ответ. Еще раз спасибо! – Jules

Смежные вопросы