Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: сохранение русского текста в wddx формате
 
 автор: bonis   (05.08.2004 в 12:56)   письмо автору
 
 

Здравствуйте!
Я сохраняю обекты в БД (субд MySQL), при этом свойства объектов из-за их не предсказуемости сохраняю в тексте в формате wddx пакета.
Так вот проблема такая: при создании wddx пакета неправильно кодируются русские буквы и вместо них потом появляются знаки вопроса ????. В мане написано использовать setlocale если хотите сеарилизовать не АСКИИ символы, я ставлю локаль "rus", пробовал "russian", как на сайте майкрософта в списке поддерживаемых локалей, но все равно ничего не получается.
Поскажите плиз где хоть почитать по этому поводу.

   
 
 автор: glsv (Дизайнер)   (05.08.2004 в 13:49)   письмо автору
 
   для: bonis   (05.08.2004 в 12:56)
 

А не пробовали другие значения локали.

Я использую ru
Видел использование:
ru_RU.CP1251 и ru_RU.KOI8_R

А под какой системой проверяете? *NIX, Win?

   
 
 автор: bonis   (05.08.2004 в 14:11)   письмо автору
 
   для: glsv (Дизайнер)   (05.08.2004 в 13:49)
 

Я под Win проверяю, а Вы видимо под *NIX потому что я такое видел когда FreeBSD русифицировал (ru_RU.CP1251 и ru_RU.KOI8_R), ru тож не помогает.
setlocale вызывает системную фунцкцию, а в инде есть две русские локали, даже по моему одна просто обозначения два "rus" or "russian". (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_language_strings.asp) Вот. На самом деле не оч понятно следующее...
при создании XML документа в нем полюбому указывается кодировка, так как в XML все храниться по-моему в каком-то там ISO и ему надо все правильно перекодировать, а в wddx почему-то это не указывается.

   
 
 автор: glsv (Дизайнер)   (05.08.2004 в 14:16)   письмо автору
 
   для: bonis   (05.08.2004 в 14:11)
 

Хм, надо спросить Cheopsa... Он щас недоступен, но к ночи появится.

   
 
 автор: cheops   (05.08.2004 в 22:50)   письмо автору
 
   для: bonis   (05.08.2004 в 14:11)
 

Странно всё это... А версия PHP какая? Вот только что сериализовал текстовую строку (WinXP(русский), PHP 5.0.0, Apache 2.0.49) - в какой кодировке она попала функции wddx_serialize_value() и wddx_serialize_vars(), такой получилась и в результирующем документе... Непонятно откуда берутся знаки ????... Они появляются до помещения их в базу данных или после? Как раз для неё характерны проблемы с кодировкой, особенно для MySQL 5 альфа, которая по умолчанию скомпилена без поддержки русских кодировок, но на сколько я понял проблема возникает до помещения строки в БД...

   
 
 автор: bonis   (05.08.2004 в 23:06)   письмо автору
 
   для: cheops   (05.08.2004 в 22:50)
 

Видимо так оно и есть, сегодня еще попробую, завтра отпишусь.
Без базы у меня тож все в порядке, и получаются эти ??? видимо после извлечения из базы. На 99% Вы правы. Проверю.

   
 
 автор: cheops   (05.08.2004 в 23:19)   письмо автору
 
   для: bonis   (05.08.2004 в 23:06)
 

Тогда лучше поместить документ в поле типа BLOB, а не в TEXT, это позволило бы избежать проблем с кодировкой...

   
 
 автор: bonis   (05.08.2004 в 23:36)   письмо автору
 
   для: cheops   (05.08.2004 в 23:19)
 

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

   
 
 автор: cheops   (05.08.2004 в 23:59)   письмо автору
 
   для: bonis   (05.08.2004 в 23:36)
 

Да, действительно странно... Попробуйте ещё данные выбирать с из таблицы с ключевым словом BINARY:
SELECT BINARY str FROM base

   
 
 автор: bonis   (06.08.2004 в 01:20)   письмо автору
 
   для: cheops   (05.08.2004 в 23:59)
 

Проблемы с базой может быть тоже есть, но вот они еще есть и до сохранения в базу.
<?php
$ruStr_after 
"Добрый день!!!";

$packet_id wddx_packet_start("test packet");
wddx_add_vars($packet_id"ruStr_after");
$packet wddx_packet_end($packet_id);

$ruStr_behind wddx_deserialize($packet);


print 
$ruStr_after " - ПРОСТО СТРОКА";
print 
"<br>---------------------------------------------------<br>";
print 
$packet " - WDDX ПАКЕТ (в IE6)";
print 
"<br>---------------------------------------------------<br>";
print 
$ruStr_behind['ruStr_after'] . " - СТРОКА ПОСЛЕ ДЕСЕРИАЛИЗАЦИИ";
?>


Теперь то что в браузере


Добрый день!!! - ПРОСТО СТРОКА
---------------------------------------------------
Добрый день!!! - WDDX ПАКЕТ (в IE6)
---------------------------------------------------
????!!! - СТРОКА ПОСЛЕ ДЕСЕРИАЛИЗАЦИИ


PHP 5.0.0
Apache 1.3.27

   
 
 автор: cheops   (06.08.2004 в 10:56)   письмо автору
 
   для: bonis   (06.08.2004 в 01:20)
 

Дело вот в чём (я совсем эту фишку забыл :) Сразу настроживают знаки вопроса - это признак того, что строка возвращается в UNICODE: символов в русской строке 9, а вопросов 4 - как раз в два раза меньше...
Я немного изменил ваш скрипт:
<?php
$str 
"Добрый день!!!"

$packet_id wddx_packet_start("test packet"); 
wddx_add_vars($packet_id"str"); 
$packet wddx_packet_end($packet_id); 
$packet utf8_encode(convert_cyr_string($packet,"w","i"));
$ruStr_behind wddx_deserialize($packet); 
print 
$str." - СТРОКА ДО ДЕСЕРИАЛИЗАЦИИ<br>";
print 
convert_cyr_string($ruStr_behind['str'],"i","w") . " - СТРОКА ПОСЛЕ ДЕСЕРИАЛИЗАЦИИ"
?>

Вот результат его работы:

Добрый день!!! - СТРОКА ДО ДЕСЕРИАЛИЗАЦИИ
Добрый день!!! - СТРОКА ПОСЛЕ ДЕСЕРИАЛИЗАЦИИ

   
 
 автор: bonis   (06.08.2004 в 12:51)   письмо автору
 
   для: cheops   (06.08.2004 в 10:56)
 

Офигенно, просто супер. Я сам эксперементировал с конвертацией русской строки из win в iso и обратно, но вот моего опыта не хватило распознать в строке юникод, хотя меня тоже удивляло уменьшение символов, и только теперь я все понял.
Спасибо большое всем, кто принимал участие, и особенно cheops!!!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования