strlen, mb_strlen, какой использовать? - PullRequest
18 голосов
/ 19 сентября 2009

Как я могу узнать набор символов в $ _REQUEST? и как установить набор символов $ _REQUEST?

Ответы [ 3 ]

18 голосов
/ 19 сентября 2009

Короче говоря: вы на самом деле не знаете о кодировке (наборе символов), используемой для переменных, которые передаются в ваш PHP-скрипт через GET или POST (особенно GET здесь проблема). По соглашению браузеры POST формируют ресурс на стороне сервера, указанный в action -атрибуте, используя кодировку страницы, которая может быть указана с помощью http-equiv -meta-tag (charset -meta-tag в HTML5) или через HTTP заголовок. В качестве альтернативы некоторые браузеры также учитывают атрибут accept-charset в форме при выборе правильной кодировки.

Кодировка параметров GET и самого URL-адреса зависит от настроек браузера и поэтому может контролироваться пользователем. Вы не должны полагаться на определенную кодировку.

Как правило, вы можете обойти большинство проблем, связанных с кодированием, последовательно используя UTF-8 для всего и указав правильную кодировку в заголовке HTTP (Content-Type: text/html; charset=UTF-8) - это приведет к правильной кодировке (UTF-8) в все переменные, которые передаются в вашу строку (мы не говорим о сценариях ружья, которые намеренно пытаются связываться с кодировкой, чтобы учесть некоторые векторы атаки в вашем сценарии). Вы также не должны полагаться на не-ascii-символы в параметрах GET или в URL-адресе (это также причина, по которой SEO-дружественные ссылки удаляют эти символы или заменяют их).

Если вы убедились, что UTF-8 является единственным допустимым набором символов, вы можете использовать mb_strlen($string, 'UTF-8'), например, для проверки длины переменной.

РЕДАКТИРОВАТЬ: (добавил несколько ссылок)

Некоторые вещи для вас, чтобы прочитать:

5 голосов
/ 19 сентября 2009

используйте mb_internal_encoding , чтобы узнать, какая кодировка установлена ​​в данный момент. Если ваше приложение использует журнал другой кодировки, вам лучше использовать mb_strlen.

Приветствия

1 голос
/ 19 сентября 2009

Обычно у вас есть контроль над кодировкой символов, так как вы создаете $ _REQUEST из HTML-кода, который вы отправляете клиенту.

т.е.: генерируется страницей, которую вы отправили из PHP.

Таким образом, вам не нужно обнаруживать кодировку.

Использование mb_functions требует включения многобайтового расширения - поэтому, если вы распространяете код, вы должны знать, что не у всех он будет.

header('Content-Type: text/html; charset=UTF-8');

ИЛИ в HTML:

<meta charset="utf-8">

http://www.w3.org/International/O-charset

Редактировать: PHP6 имеет поддержку utf-8, а не PHP5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...