Короче говоря: вы на самом деле не знаете о кодировке (наборе символов), используемой для переменных, которые передаются в ваш 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')
, например, для проверки длины переменной.
РЕДАКТИРОВАТЬ: (добавил несколько ссылок)
Некоторые вещи для вас, чтобы прочитать: