кодировка GET-переменной

  • Автор темы Автор темы Beavis
  • Дата начала Дата начала

Beavis

Banned
кодировка GET-переменной

В скрипт из формы методом GET передается строковая переменная, содержащая текст на русском языке.
При передаче из формы переменная приходит в кодировке utf-8, а если её значение просто подставить руками в url, то в 1251 (это я как понимаю из за того что значение автоматически преобразуется из такого формата "%EF%F0%EE%E2%E5%F0%EA%E0")
Как я могу определить в скрипте что переменная пришла в 1251?
 
GET тут совершенно не причем, не важно, как пришли данные. Соответественно задача определения кодировки решается безотносительно того, GET это или не GET-переменная.
 
сделал вот так
PHP:
function to_utf8($str) {
	if (!preg_match('/^.{1}/us',$str)) {
		$str = iconv("windows-1251", "utf-8", $str);
	}
	return $str;
}

работает
 
Beavis, так в зависимости от обстоятельств браузер будет кодировать из 1251 или из утф.

поэтому НЕЛЬЗЯ писать не-ASCII в GET, боком выходит.

п.с. а что будет, если у тебя первым символом в $str будет ASCII символ, а потом текст в 1251? ну ты в курсе, что определение кодировки в общем случае очень сложная задача?
 
dimagolov
Ты предлагаешь мне рядом с формой написать пользователям "пожалуйста, не пишите сюда ничего кроме ASCII" ? =)

если фаерфокс так составляет GET-запрос, подставляя в него при отправке формы данные в UTF-8, то вопрос "можно" или "нельзя" уже не стоит..

а таким решением я проверяю что если строка не в utf-8, я её преобразовываю.. и теперь всё наконец то в одной кодировке)

п.с. функция всё равно будет работать правильно, так что это решение идеально подходит если кодировки может быть всего две: 1251 и utf-8
 
костыль
Код:
public function is_utf8($string) {
    for ($i=0; $i<strlen($string); $i++) {
      if (ord($string[$i]) < 0x80) continue;
      elseif ((ord($string[$i]) & 0xE0) == 0xC0) $n=1;
      elseif ((ord($string[$i]) & 0xF0) == 0xE0) $n=2;
      elseif ((ord($string[$i]) & 0xF8) == 0xF0) $n=3;
      elseif ((ord($string[$i]) & 0xFC) == 0xF8) $n=4;
      elseif ((ord($string[$i]) & 0xFE) == 0xFC) $n=5;
      else return false;

      for ($j=0; $j<$n; $j++) {
        if ((++$i == strlen($string)) || ((ord($string[$i]) & 0xC0) != 0x80)) return false;
      }
    }
    return true;
  }
 
Beavis, ты не понял. проблема не тогда, когда ФФ отправляет форму (тогда как раз кодировка соответствует кодировке странице, она у тебя корректная, я надеюсь), а тогда, когда этот GET запрос сохранен в букмарках, набран юзером в address bar руками или послан хакером Васей. Вот тогда отправитель запроса как бы без руля, какая кодировка "правильная" для сайта. но проблема в принципе возникает всегда, потому что получая запрос ты без понятия, кто его сформировал, форма или кто еще и вынужден гадать на кофейной гуще всегда.

Решение простое. Посылать такие формы через POST. Если это поиск, и надо давать возможность сохранить результаты поиска в букмарках то сохранять параметры поиска в базе и делать переадресацию на search.php?searchid=12345, если сохранять не нужно, то просто переадресация на отображение результата запроса.
 
dimagolov, отвратительное решение.
Очень хорошо, что ни яндекс, ни википедия не последовали ему =)
 
MiksIr, с википедией есть нюанс. одно дело когда мы получаем ссылку на статью и нам надо ее найти, тогда гадание какая кодировка очень недолгое:
1. каждая национальная вики имеет свой субдомен
2. для каждого национального языка есть совй ограниченный набор кодировок
3. можно проверить имеется ли такая статься для любого варианта кодировки
4. если ничего не нашли, то уже можно поработать со словарями и определить исходную кодировку из словаря

но если у нас параметры запроса, которые надо писать в базу.... то стоит 10 раз подумать и или воспользоваться достоверными методами определения кодировки, или все же не использовать GET запрос.
 
Сверху