iconv, MySQL, формы: Разъясните ситуация с функцией

K.Lomov

Guest
iconv, MySQL, формы: Разъясните ситуацию с функцией

Здравствуйте,
дорогие участники конференции! :)D)

- Я прочитал часть информации по этому вопросу, но так и не пришел к сути. Опыта с процедурой сохранения данных в базу у меня ещё нет и поэтому, я хотел бы попросить вас прояснить мне ситуацию со связкой:

ФОРМЫ --------->--------- PHP ---------->--------- MySQL
[win1251]--->---(процедуры перекодировки)--->----[UTF-8]

Эта ситуация наверняка всем знакома, и я думаю, что информация из этого топика пригодится и другим интересующимся.

* - в отмеченном могут быть ошибки "по неопытности"

1. После отправки информации со смешанными Русскими и
Латинскими знаками я обнаружим то, что в базе данных они
сохраняются в виде совсем других символов.

Пример:
Мы летали по гаре


2. Для решения этой ошибки я решил воспользоваться функцией iconv() следующим образом: *
PHP:
// $post - $_POST['data'] - полученные данные из формы
// 1. Попытка - Не работает
$post=iconv("cp1251","UTF-8",$post);
// 2. Попытка - Не работает
$post=iconv("windows-1251","UTF-8",$post);
В обеих попытках результатом стала следующая строка...
Результат:
Мы ребята удалые, Лезим в щели половые.

А альтернативная функция utf8_encode, русский язык, как мне обьяснили - не обрабатывает.


3. После этого, я решил попробывать иной способ - перекодировать информацию при помощи "самодельной" функции:
PHP:
function utf8_encode_ru($input) {
$output = "";

   for ( $i = 0; $i < strlen( $input ); $i++ )
   {
       $asc = ord( $input[$i] );

       if ( $asc >= 192 && $asc <= 255 )
           $output .=  "&#".( 1040 + ( $asc - 192 ) ).";";
       else if ( $asc == 168 )
           $output .= "&#".( 1025 ).";";
       else if ( $asc == 184 )
           $output .= "&#".( 1105 ).";";
       else
           $output .= $input[$i];
   }
   
   return $output;
}

Результат был очень положительным, в HTML всё выводилось правильно и так как нужно.
Но в базе данных, информация принимала очень неудобную форму*:

Пример:
&amp;#1052;&amp;#1099; &amp;#1088;&amp;#1077;&amp;#1073;&amp;#1103;&amp;#1090;&amp;#1072; &amp;#1091;&amp;#1076;&amp;#1072;&amp;#1083;&amp;#1099;&amp;#1077;,
&amp;#1051;&amp;#1077;&amp;#1079;&amp;#1080;&amp;#1084; &amp;#1074; &amp;#1097;&amp;#1077;&amp;#1083;&amp;#1080; &amp;#1087;&amp;#1086;&amp;#1083;&amp;#1086;&amp;#1074;&amp;#1099;&amp;#1077;




Теперь вопросы:

1) В ситуации номер три. Есть ли возможность сохранять данные в базу, в более "визуальном формате". Чтобы они отображались как нормальные Русские буквы, а не их HTML ASCII-код?

2) В ситуации номер два. Очень жаль, что стандартные функции не работают с Русским языком. Пробывал ли кто нибудь "навести в этом порядок" написав разработчикам?

3) Если на первый вопрос ответ будет негативным, то должен ли я перекодировать все страницы проэкта в UTF-8, для того чтобы в PHP не проходило особо больших операций перекодирования. Поможет ли это в данной ситуации?


* * *

P.S.: Я уверен, что данную тему уже не раз поднимали и за это - прошу прощения. Но хорошо если у людей будет точный ответ на все основные вопросы по пунктам, ибо сейчас нужные ответы расбросаны по разным топикам и их очень трудно найти.
 

neko

tеam neko
все что нужно было сразу сделать, это отдать правильный заголовок
 

K.Lomov

Guest
Можно чуть-чуть по-точнее? :)
Заголовок страницы с формой? А кроме этого есть возможности?
 

neko

tеam neko
ну ты сохранилв utf8, замечательно
потом прочитал и вывел
теперь осталось бразуеру сообщить, что страница в этой кодировке

-~{}~ 27.03.05 20:54:

и вообще нет никакого смысла туда сюда делать iconv
тогда уж надо и хранить все в win-1251
 

neko

tеam neko
> В обеих попытках результатом стала следующая строка...
> Результат:
> Мы ребята удалые, Лезим в щели
> половые.

это utf8 и есть, насколько я могу судить
а вот это:

> я обнаружим то, что в базе данных они
> сохраняются в виде совсем других символов.

как ты это обнаружил?
вывел куда-то, правильно?
вот надо в браузер так же выводить + указывать кодировку для страницы
 

tony2001

TeaM PHPClub
K.Lomov
1) зайди на http://www.google.com.
2) выставь насильно в браузере кодировку win1251.
3) ничего не напоминает?
 

K.Lomov

Guest
Хорошо :)
Обьясню в чём дело...

Даже если это UTF-8, мне бы желательно вот всего вот этого избежать:

"Мы ребята удалые, Лезим в щели половые."

"&amp;#1052;..."

"Мы ребята удалые, Лезим в щели половые."

"Мы летали ГђВїГђВѕ гарÐВ"

вывел куда-то, правильно?

Ибо люди будут читать данные базы не только через браузер, но и через другие программы. И мне бы нехотелось сделать их чтение результативным без "переводчика каракулей" :)
 

Frol

Новичок
зачем было вообще трогать UTF-8, если не понимаешь что это?
 

K.Lomov

Guest
Автор оригинала: Frol
зачем было вообще трогать UTF-8, если не понимаешь что это?
Ну чтобы понять - всёравно надо потрогать :)

-~{}~ 27.03.05 21:30:

Ибо люди будут читать данные базы не только через браузер, но и через другие программы. И мне бы нехотелось сделать их чтение результативным без "переводчика каракулей"
Если вы мне скажете - что это программы кривые, то в этом случая - проблемма не моя и я вас отблагодарю за помощь :)
 

neko

tеam neko
нормально, да?
конвертировать в utf, чтобы потом его избежать
 

K.Lomov

Guest
Хорошо, спасибо neko, ты настоящий друг :)

Тогда уж сразу, какой функцией лучше всего UTF-8 в Windows-1251 ? :D
 

neko

tеam neko
откуда у тебя возмется utf, если его нигде нет, пока ты сам его искуственным путем не создаешь?
функция та же: iconv
 

K.Lomov

Guest
откуда у тебя возмется utf, если его нигде нет, пока ты сам его искуственным путем не создаешь?
Эыэээээ... :D



upd: оказалось что господин программист (не я), который делал те самые программы для отображения содержания базы данных - допустил небольшую ошибку - полностью проигнорировал поддержку любых кодировок кроме одной. И именно изза этого я видел глючный текст, который на html-странице отображался чудесным образом.

Поэтому,
ИЗВИНИТЕ МЕНЯ
За недоразумение %)

P.S.: И спасибо tony, за ту работу которую он делает чтобы содержать этот форум в самом наилучшем состоянии :D
 
Сверху