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

Beavis

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

В скрипт из формы методом GET передается строковая переменная, содержащая текст на русском языке.
При передаче из формы переменная приходит в кодировке utf-8, а если её значение просто подставить руками в url, то в 1251 (это я как понимаю из за того что значение автоматически преобразуется из такого формата "%EF%F0%EE%E2%E5%F0%EA%E0")
Как я могу определить в скрипте что переменная пришла в 1251?
 

С.

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

Beavis

Banned
сделал вот так
PHP:
function to_utf8($str) {
	if (!preg_match('/^.{1}/us',$str)) {
		$str = iconv("windows-1251", "utf-8", $str);
	}
	return $str;
}
работает
 

dimagolov

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

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

п.с. а что будет, если у тебя первым символом в $str будет ASCII символ, а потом текст в 1251? ну ты в курсе, что определение кодировки в общем случае очень сложная задача?
 

Beavis

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

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

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

п.с. функция всё равно будет работать правильно, так что это решение идеально подходит если кодировки может быть всего две: 1251 и utf-8
 

MiksIr

miksir@home:~$
костыль
Код:
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;
  }
 

dimagolov

Новичок
Beavis, ты не понял. проблема не тогда, когда ФФ отправляет форму (тогда как раз кодировка соответствует кодировке странице, она у тебя корректная, я надеюсь), а тогда, когда этот GET запрос сохранен в букмарках, набран юзером в address bar руками или послан хакером Васей. Вот тогда отправитель запроса как бы без руля, какая кодировка "правильная" для сайта. но проблема в принципе возникает всегда, потому что получая запрос ты без понятия, кто его сформировал, форма или кто еще и вынужден гадать на кофейной гуще всегда.

Решение простое. Посылать такие формы через POST. Если это поиск, и надо давать возможность сохранить результаты поиска в букмарках то сохранять параметры поиска в базе и делать переадресацию на search.php?searchid=12345, если сохранять не нужно, то просто переадресация на отображение результата запроса.
 

MiksIr

miksir@home:~$
dimagolov, отвратительное решение.
Очень хорошо, что ни яндекс, ни википедия не последовали ему =)
 

dimagolov

Новичок
MiksIr, с википедией есть нюанс. одно дело когда мы получаем ссылку на статью и нам надо ее найти, тогда гадание какая кодировка очень недолгое:
1. каждая национальная вики имеет свой субдомен
2. для каждого национального языка есть совй ограниченный набор кодировок
3. можно проверить имеется ли такая статься для любого варианта кодировки
4. если ничего не нашли, то уже можно поработать со словарями и определить исходную кодировку из словаря

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