|
|
|
| Здравствуйте!
Я сохраняю обекты в БД (субд MySQL), при этом свойства объектов из-за их не предсказуемости сохраняю в тексте в формате wddx пакета.
Так вот проблема такая: при создании wddx пакета неправильно кодируются русские буквы и вместо них потом появляются знаки вопроса ????. В мане написано использовать setlocale если хотите сеарилизовать не АСКИИ символы, я ставлю локаль "rus", пробовал "russian", как на сайте майкрософта в списке поддерживаемых локалей, но все равно ничего не получается.
Поскажите плиз где хоть почитать по этому поводу. | |
|
|
|
|
|
|
|
для: bonis
(05.08.2004 в 12:56)
| | А не пробовали другие значения локали.
Я использую ru
Видел использование:
ru_RU.CP1251 и ru_RU.KOI8_R
А под какой системой проверяете? *NIX, Win?
| |
|
|
|
|
|
|
|
для: 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 почему-то это не указывается. | |
|
|
|
|
|
|
|
для: bonis
(05.08.2004 в 14:11)
| | Хм, надо спросить Cheopsa... Он щас недоступен, но к ночи появится. | |
|
|
|
|
|
|
|
для: bonis
(05.08.2004 в 14:11)
| | Странно всё это... А версия PHP какая? Вот только что сериализовал текстовую строку (WinXP(русский), PHP 5.0.0, Apache 2.0.49) - в какой кодировке она попала функции wddx_serialize_value() и wddx_serialize_vars(), такой получилась и в результирующем документе... Непонятно откуда берутся знаки ????... Они появляются до помещения их в базу данных или после? Как раз для неё характерны проблемы с кодировкой, особенно для MySQL 5 альфа, которая по умолчанию скомпилена без поддержки русских кодировок, но на сколько я понял проблема возникает до помещения строки в БД... | |
|
|
|
|
|
|
|
для: cheops
(05.08.2004 в 22:50)
| | Видимо так оно и есть, сегодня еще попробую, завтра отпишусь.
Без базы у меня тож все в порядке, и получаются эти ??? видимо после извлечения из базы. На 99% Вы правы. Проверю. | |
|
|
|
|
|
|
|
для: bonis
(05.08.2004 в 23:06)
| | Тогда лучше поместить документ в поле типа BLOB, а не в TEXT, это позволило бы избежать проблем с кодировкой... | |
|
|
|
|
|
|
|
для: cheops
(05.08.2004 в 23:19)
| | В том то и дело что у меня чейчас в блобе лежит, попробую в тексте...
Вообще не думал что такие траблы возникнут. | |
|
|
|
|
|
|
|
для: bonis
(05.08.2004 в 23:36)
| | Да, действительно странно... Попробуйте ещё данные выбирать с из таблицы с ключевым словом BINARY:
SELECT BINARY str FROM base
|
| |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: 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") . " - СТРОКА ПОСЛЕ ДЕСЕРИАЛИЗАЦИИ";
?>
|
Вот результат его работы:
Добрый день!!! - СТРОКА ДО ДЕСЕРИАЛИЗАЦИИ
Добрый день!!! - СТРОКА ПОСЛЕ ДЕСЕРИАЛИЗАЦИИ
|
| |
|
|
|
|
|
|
|
для: cheops
(06.08.2004 в 10:56)
| | Офигенно, просто супер. Я сам эксперементировал с конвертацией русской строки из win в iso и обратно, но вот моего опыта не хватило распознать в строке юникод, хотя меня тоже удивляло уменьшение символов, и только теперь я все понял.
Спасибо большое всем, кто принимал участие, и особенно cheops!!! | |
|
|
|