Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Кодировка переменной GET


Автор: FredFrield 21.11.2008, 20:56
Как всегда проблема с русским... помучился по поиску не нашёл нечё путного... 
Для примера: есть два файла:

s.php - основная форма отправка, метод строго GET. Кодировка файла ANSI

Код

<?php 
header("Content-type: text/html; charset=UTF-8");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);

print '<?xml version="1.0" encoding="utf-8"?>'; 
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>

<title>TEST</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />


</head>

<body>


<form method="GET" action="get.php">

<input type="text" name="text">
<input type="submit" value="send">

</form>


</body></html>


get.php - второй файл, Кодировка файла тажа ANSI
Код

<?php
header("Content-type: text/html; charset=UTF-8");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);

echo preg_match('/[a-zA-Zа-яА-Я0-9_]+$/', $_GET['text']);
?>



При отправке теста с русскими символами, переменная передаётся в $_GET['text'], но не пропускается регуляркой... 

Мои предположение: проблема с кодировкой самой передаваемой переменной и чувствительность, возможно, функции preg_match к X кодировкам или свои принципы метода GET ... Как решить проблему не нашёл, главные условия : метод GET и то что файлы останутся в кодировке ANSI...

Кто что посоветует? как обойти трабл?))) Заранее Спасибо! 

Автор: theworldcreator 21.11.2008, 23:45
>> header("Content-type: text/html; charset=UTF-8");

Это говорит браузеру что данные будут в utf. Следовательно он и исходящие данные в него(юникод) кодирует. Если напишешь в первом файле что нибудь на русском в html-коде это побьется, так как браузер будет выводить через юникод данные в твоей кодировке.

Автор: unicross 22.11.2008, 05:28
Код

$_GET['text'] = iconv("utf-8", "windows-1251", $_GET['text']);

перед строкой
Цитата(FredFrield @  21.11.2008,  20:56 Найти цитируемый пост)
echo preg_match('/[a-zA-Zа-яА-Я0-9_]+$/', $_GET['text']);

Это решит проблему в вашем случае, но тем не менее проблема с русским языком останется. Если вы передаете данные в windows-1251, а заголовок отправляете utf-8, то все отправляемые браузеру данные необходимо перевести в кодировку utf-8 с помощью
Код

$HTMLtext = iconv("windows-1251", "utf-8", $HTMLtext);

s.php
Код

<?php 
header("Content-type: text/html; charset=UTF-8");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);

$HTMLtext = '<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>TEST</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body>
<form method="GET" action="get.php">
<input type="text" name="text">
<input type="submit" value="Отправить">
</form>
</body></html>';
echo iconv("windows-1251", "utf-8", $HTMLtext);
?>

get.php
Код

<?php
header("Content-type: text/html; charset=UTF-8");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);

echo $_GET['text'] . "<BR>";
$_GET['text'] = iconv("utf-8", "windows-1251", $_GET['text']);
echo preg_match('/[a-zA-Zа-яА-Я0-9_]+$/', $_GET['text']);
echo iconv("windows-1251", "utf-8", "<BR>Привет всем<BR>");
?>

Автор: theworldcreator 22.11.2008, 12:14
По моему вариант выше - страшный изврат, нужный непонятно где(по крайней мере я не могу придумать ситуации, когда хедер фиксирован, кодировка файлов тоже и приходится все перегонять из одной кодировки в другую), а FredFrield просто скопировал 3 строки с объявлением хедеров когда-то, не понимая что они значат, и теперь всюду пихает.
http://www.google.ru/search?q=протокол+http

Автор: FredFrield 22.11.2008, 12:58
Для theworldcreator:
не сказал бы, что я нечего не понимаю... 
я написал на быструю руку пример и закинул хедеры, что б сымитировать проблему, та которая у меня стоит... да согласен, можно было не отключать кеширование и так далее...

Если бы я не знал, что пишу, я бы спросил. Если ты сомневаешься в моих знаниях, могу доказать обратное описав всё подробно...



в реале я использую динамическую подгрузку, вот почему два условия: файлы должны быть сохранение в формате ANSI и использование GET

почему именно написал UTF-8 в примере? просто если б этого не сделал было б огромное количество постов использовать именно эту кодировку...  

Если быть точнее у меня в скрипте стоит для файла отправки  ( s.php ) charset=windows-1251.
и всё играет свою роль...

unicross,  Спасибо за ответ и идею... начну исследовать! 

Автор: theworldcreator 22.11.2008, 14:31
Цитата

почему именно написал UTF-8 в примере? просто если б этого не сделал было б огромное количество постов использовать именно эту кодировку...  

Эта фраза свидетельствует о твоем непонимание вопроса. Когда ты отправляешь хедер браузеру у тебя НЕ меняеться кодировка, просто ты обманываешь браузер. Если бы ты спросил, как перевести данные из одной кодировке в другую, тебе бы сразу ответили.

Код

<?php
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
print '<?xml version="1.0" encoding="cp1251"?>'; 
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>TEST</title>
<meta http-equiv="content-type" content="text/html; charset=cp1251" />
</head>
<body>
<form method="GET" action="get.php">
<input type="text" name="text">
<input type="submit" value="send">
</form>
</body></html>

Код

<?php
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);

echo preg_match('/[a-zA-Zа-яА-Я0-9_]+$/', $_GET['text']);
?>


пользуйся

P.S. Крайне советую таки почитать основы.

Добавлено через 3 минуты и 45 секунд
Кстати можешь оставить хедеры с объявлением кодировки и настроить сервер для автоматического перекодирования файлов для пользователей(.htaccess) Но делать это вручную со всеми данными на вывод - не вариант.

Автор: FredFrield 22.11.2008, 14:36
проблема решена
Код

preg_match('/[a-zA-Zа-яА-Я0-9_]+$/', iconv("utf-8", "windows-1251", $_GET['text']))

увы заголовок в файле get.php востребователен charset=UTF-8 

Автор: theworldcreator 22.11.2008, 14:39
Прекрасно. А если так:

s.php
Код

<?php 
header("Content-type: text/html; charset=UTF-8");
//...
print '<?xml version="1.0" encoding="utf-8"?>'; 
?>
//...
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body>
Русский текст
//...


М?

Автор: FredFrield 22.11.2008, 14:42
Цитата

Эта фраза свидетельствует о твоем непонимание вопроса. Когда ты отправляешь хедер браузеру у тебя НЕ меняеться кодировка, просто ты обманываешь браузер. Если бы ты спросил, как перевести данные из одной кодировке в другую, тебе бы сразу ответили.

я понимаю, что таким способом обманываю браузер)


Цитата

Кстати можешь оставить хедеры с объявлением кодировки и настроить сервер для автоматического перекодирования файлов для пользователей(.htaccess) 

идея хорошая, если так смотреть в общих чертах, но пытался сделать, не принимало.

Решил проверить твой вариант... жалко не пашет.... может быть я не точный пример привёл...

Добавлено через 3 минуты и 17 секунд
+ мне не важен вывод на странице русского текста... а то, что мне передаётся в файл get.php и почему регулярка не обрабатывала русский, вот в чём была проблема. 

Автор: theworldcreator 22.11.2008, 14:51
Цитата

Решил проверить твой вариант... жалко не пашет.... может быть я не точный пример привёл...


Вероятно ты сохранил get.php в кодировке, отличной от ANSI. У меня по крайней мере все работало.

Автор: FredFrield 22.11.2008, 17:17
Цитата

Вероятно ты сохранил get.php в кодировке, отличной от ANSI. У меня по крайней мере все работало.

у меня стандарт стоит...


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)