Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кодировка переменной GET 
V
    Опции темы
FredFrield
Дата 21.11.2008, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 4.4.2006

Репутация: нет
Всего: нет



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

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...

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

Это сообщение отредактировал(а) FredFrield - 21.11.2008, 20:56

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  php.rar 0,63 Kb
PM MAIL   Вверх
theworldcreator
Дата 21.11.2008, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 362
Регистрация: 25.8.2007
Где: Москва

Репутация: 10
Всего: 13



>> header("Content-type: text/html; charset=UTF-8");

Это говорит браузеру что данные будут в utf. Следовательно он и исходящие данные в него(юникод) кодирует. Если напишешь в первом файле что нибудь на русском в html-коде это побьется, так как браузер будет выводить через юникод данные в твоей кодировке.
PM MAIL WWW ICQ   Вверх
unicross
Дата 22.11.2008, 05:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 422
Регистрация: 15.6.2008

Репутация: 21
Всего: 53



Код

$_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>");
?>

PM MAIL WWW   Вверх
theworldcreator
Дата 22.11.2008, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 362
Регистрация: 25.8.2007
Где: Москва

Репутация: 10
Всего: 13



По моему вариант выше - страшный изврат, нужный непонятно где(по крайней мере я не могу придумать ситуации, когда хедер фиксирован, кодировка файлов тоже и приходится все перегонять из одной кодировки в другую), а FredFrield просто скопировал 3 строки с объявлением хедеров когда-то, не понимая что они значат, и теперь всюду пихает.
http://www.google.ru/search?q=протокол+http
PM MAIL WWW ICQ   Вверх
FredFrield
Дата 22.11.2008, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 4.4.2006

Репутация: нет
Всего: нет



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

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



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

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

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

unicross,  Спасибо за ответ и идею... начну исследовать! 
PM MAIL   Вверх
theworldcreator
Дата 22.11.2008, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 362
Регистрация: 25.8.2007
Где: Москва

Репутация: 10
Всего: 13



Цитата

почему именно написал 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) Но делать это вручную со всеми данными на вывод - не вариант.

Это сообщение отредактировал(а) theworldcreator - 22.11.2008, 14:32
PM MAIL WWW ICQ   Вверх
FredFrield
Дата 22.11.2008, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 4.4.2006

Репутация: нет
Всего: нет



проблема решена
Код

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

увы заголовок в файле get.php востребователен charset=UTF-8 
PM MAIL   Вверх
theworldcreator
Дата 22.11.2008, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 362
Регистрация: 25.8.2007
Где: Москва

Репутация: 10
Всего: 13



Прекрасно. А если так:

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>
Русский текст
//...


М?
PM MAIL WWW ICQ   Вверх
FredFrield
Дата 22.11.2008, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 4.4.2006

Репутация: нет
Всего: нет



Цитата

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

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


Цитата

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

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

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

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

Это сообщение отредактировал(а) FredFrield - 22.11.2008, 14:44
PM MAIL   Вверх
theworldcreator
Дата 22.11.2008, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 362
Регистрация: 25.8.2007
Где: Москва

Репутация: 10
Всего: 13



Цитата

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


Вероятно ты сохранил get.php в кодировке, отличной от ANSI. У меня по крайней мере все работало.
PM MAIL WWW ICQ   Вверх
FredFrield
Дата 22.11.2008, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 4.4.2006

Репутация: нет
Всего: нет



Цитата

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

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


да я знаю, я и сам для своего примера решил проблему... но всё же для моей конкретной задачи суть проблемы, как я и догадывался, стояло в кодировке передаваемой переменной... спс всё равно за помощь. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0676 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.