Являются ли символы строк PHP подписанными или беззнаковыми и почему, например. ord(Ø) не соответствует расширенной таблице ASCII?

попробуйте код ниже:

<?php

echo "ORD ~ = ".ord("~");

На основе расширенной таблицы ASCII -> http://www.ascii-code.com/ вывод является

ORD ~ = 126

Это правильно, но тогда при выводе чего-либо в расширенную таблицу ASCII, например Ø:

<?php

echo "ORD Ø = ".ord("Ø");

Дает:

ORD Ø = 195

В то время как в связанной расширенной таблице ASCII правильный код для «Ø» - 216. То же самое, например. для (ord("√") выводит 226, в то время как правильный расширенный символ ASCII для 226 — â, а √ отсутствует даже в таблице ).

Итак, мой вопрос заключается в том, что строки PHP в основном представляют собой массив строк ($str[0] для первого символа, $str[1] для второго, типа C и т. д...), и поскольку PHP не имеют тип char, как PHP обрабатывает 1-байтовый символ, когда он обрабатывает его отдельно, например используя предыдущую функцию ord() и функции pack() и unpack()?

Являются ли символы PHP беззнаковыми или они подписаны? Какая разница?

Как я должен интерпретировать эту фразу A string is series of characters, where a character is the same as a byte. This means that PHP only supports a 256-character set, взятую из руководства по PHP?

256-character означает, что он поддерживает расширенный ASCII? Но почему тогда эти различия при вызове ord() для расширенных символов ASCII?

Спасибо за внимание!


person tonix    schedule 15.12.2014    source источник


Ответы (1)


Ядро PHP в его нынешнем виде не имеет представления о кодировке символов. Строки - это просто, как указано в руководстве, серия байтов (8 бит без знака). Как выходной носитель интерпретирует эти байты ... за пределами php.
В вашем примере Ø мог быть закодирован в utf-8, то есть как два байта 195 и 152.
PHP, не зная о кодировке, обрабатывает эти два байта как два отдельных однобайтовых «символа». ord() принимает во внимание только первый "символ" в строке, поэтому вы получаете 195.
Таким образом, ответ: без знака, вообще без кодировки... просто байты с индикатором длины.

person VolkerK    schedule 15.12.2014
comment
И если мне нужно где-то сохранить эти байты, я могу сделать это с помощью функций упаковки/распаковки, и я буду в безопасности, верно? Опять же, это зависит от того, когда я снова преобразую эти байты в строку, какую кодировку я буду использовать для вывода строки. - person tonix; 15.12.2014
comment
Да хоть php не портит кодировку. Но всякий раз, когда вы передаете строку ... чему-либо, дважды проверьте, может ли это что-либо быть осведомленным о кодировке, а затем проверьте, имеет ли модуль php, который обрабатывает это что-либо, специализированную функцию/метод для обработки кодировки. Возьмем в качестве примера базы данных и, более конкретно, расширение mysql. Вы должны позаботиться о том, чтобы кодировка соединения была синхронизирована с самой фактической кодировкой данных, но вы замечаете это не так уж и мало, когда впервые сталкиваетесь с проблемой... определенно есть место для улучшения. - person VolkerK; 15.12.2014