Ответ 1
Чтобы сделать это коротко: вы действительно не знаете о кодировке (наборе символов), используемой для переменных, которые передаются на ваш PHP script через GET или POST (особенно GET - проблема здесь). По соглашениям браузеров POST формирует серверный ресурс, указанный в атрибуте action
, используя кодировку страницы, которая может быть указана с помощью тега http-equiv
-meta-тега (charset
-meta-tag в HTML5) или через HTTP-заголовок. В качестве альтернативы, некоторые браузеры также уважают атрибут accept-charset
в форме при правильном кодировании.
Кодирование параметров GET и самого URL-адреса зависит от настроек браузера и, следовательно, может контролироваться пользователем. Вы не должны полагаться на определенную кодировку.
Как правило, вы обойдете большинство проблем, связанных с кодированием, последовательно используя UTF-8 для всего и указав правильную кодировку в HTTP-заголовке (Content-Type: text/html; charset=UTF-8
) - это даст правильную кодировку (UTF-8) в все переменные, которые передаются в вашу строку (мы не говорим о руожских сценариях, которые намеренно пытаются испортить кодировку, чтобы позволить некоторым векторам атаки в ваш script). Вы также не должны полагаться на не-ascii-символы в ваших параметрах GET или в URL-адресе (что также является причиной того, почему SEO-дружественные ссылки удаляют эти символы или заменяют их).
Если вы убедитесь, что UTF-8 является единственным разрешенным набором символов, вы можете использовать mb_strlen($string, 'UTF-8')
для проверки длины переменной, например.
EDIT: (добавлено несколько ссылок)
Некоторые вещи для вас: