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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кодировка в DOMXML 
:(
    Опции темы
dm9
Дата 29.9.2005, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Расскажите, как разобраться с кодировками в DOMXML? Задача - сделать селект из БД, положить селектированное значение в какой-нибудь атрибут в ДОМ-дереве, распечатать это дерево. (XSLT нам пока не нужен smile )

Сначала я хотел везде использовать Win1251, но мне не понравилось то, что для работы с DOM-деревом надо использовать UTF8, и только его (я прав?). Получилось бы, что я делаю преобразование Win->UTF8 после доставания данных из БД, а после создания дерева обратно делаю UTF8->Win.

Вопрос 1. Можно ли как-то использовать Win1251 в дереве? Без конвертации, я знаю про iconv("windows-1251", "UTF-8", "Русский текст"), но мне тогда придётся вызывать эту ф-цию несколько сотен раз - я этого не хочу.

Ладно, забили на 1251, используем UTF-8.

Селект из базы проходит успешно. Если сделать echo $a, где $a - селектированное значение, то в выходе будет именно UTF-8. Всё замечательно.

Создаём дерево: $this->xml = domxml_new_doc('1.0');, делаем create_element, append_child, set_attribute. В атрибут пишем этот самый $a.

После этого делаем такое:
$q = $xml->dump_mem(true);
echo "<PRE>";
echo htmlentities($q);
echo "</PRE>";

На выходе имеем лажу типа &#x420;&#x443;&#x441;&#x441;&#x43A;&#x438;&#x439;
Нет, это именно то самое русское слово, которое я туда записал, но я хотел бы получить его не в юникоде, а в UTF-8... без дополнительного преобразования.

Можно сделать дерево не через domxml_new_doc('1.0'), а таким образом:
$this->xml = domxml_open_mem('<?xml version="1.0" encoding="UTF-8" ?><root/>');
Но тут на выходе получается совсем что-то непонятное...

В общем, всё, конечно, можно получить, но мне не хочется гонять данные из кодировки в кодировку, не хочется делать преобразование Юникод(&#xxx;)->UTF8, а хочется иметь всё в одном формате, и в нём работать. Так вот, вопрос основной: как же это сделать?

PM MAIL ICQ   Вверх
dm9
Дата 29.9.2005, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Ой, а какая жуть с кодировками там после XSLT-преобразования получается...

PM MAIL ICQ   Вверх
dm9
Дата 29.9.2005, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Всё, после преобразования разобрался - это htmlentities символы калечил smile

Остаётся вопрос о том, как в результате работы $domxml->dump_mem(true) получить нормальные символы, а не &#xxx;, но это для меня уже не столь принципиально - это будет использоваться только для отладки сайта, поэтому имеет право на существование.

Добавлено @ 17:58
Но всё в UFT-8.

Так что вопрос про то, можно ли генерить дерево в Win1251, остаётся открытым.


Это сообщение отредактировал(а) dm9 - 29.9.2005, 17:58
PM MAIL ICQ   Вверх
Sardar
Дата 29.9.2005, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

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



Цитата(dm9 @ 29.9.2005, 16:57)
Так что вопрос про то, можно ли генерить дерево в Win1251, остаётся открытым.

XML DOM дерево всегда хранит строки в юникоде(UCS2), но так как PHP не имеет 16 битного char, приходиться ложить всё в UTF-8. Заставить дерево хранить текст в других кодировках нельзя - противоречит стандарту.

НО! можно через XSLT указать: xsl:output encoding = "windows-1251" и получить сериализованное дерево в заданной кодировке.
Как только ты потом это дерево опять в DOM загрузишь, всё опять будет в юникоде smile

Цитата(dm9 @ 29.9.2005, 14:39)
Ой, а какая жуть с кодировками там после XSLT-преобразования получается...

Что за жуть? smile

Вопрос: в чём проблема UTF-8? Нет такого браузера что бы UTF-8 не понимал.



--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
dm9
Дата 29.9.2005, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Сардар, спасибо за комментарий. А можно чуть глубже, почему по стандарту нельзя хранить дерево в произвольной кодировке? Просто мне странно кажется - XML и XSL должны быть в UTF-8, а затем мы его перегоняем в Win. Как-то неоптимально... если у меня всё в Win, лишний раз туда-сюда текст гонять как-то некрасиво...

Цитата(Sardar @ 29.9.2005, 19:50)
Что за жуть?

Уже разобрался, см. выше smile

Цитата(Sardar @ 29.9.2005, 19:50)
Вопрос: в чём проблема UTF-8?

Для русских сайтов - увеличение объёма страницы в 1,5-2 раза.

Это сообщение отредактировал(а) dm9 - 29.9.2005, 19:14
PM MAIL ICQ   Вверх
Sardar
Дата 29.9.2005, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

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



Цитата(dm9 @ 29.9.2005, 18:14)
А можно чуть глубже, почему по стандарту нельзя хранить дерево в произвольной кодировке?

Для того что бы не иметь проблем при взаимодействии различного софта. Строго говоря всё должно в UTF-16 лежать.
http://www.w3.org/TR/2000/WD-DOM-Level-1-2....html#DOMString

Цитата(dm9 @ 29.9.2005, 18:14)
Как-то неоптимально...

Проверь, замерь потери времени, обычно перекодировка это быстрая операция, т.к. не требует особых вычислений и выполняеться за O(n) (константное для символа, по таблице) время. Для скриптов это вообще не вопрос smile

Цитата(dm9 @ 29.9.2005, 18:14)
Для русских сайтов - увеличение объёма страницы в 1,5-2 раза.

Разве это такая проблема? Обычно не требуеться отдавать массу текста, не малый обьём в разметке, а там как раз UTF-8 в один байт.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: X технологии | Следующая тема »


 




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


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

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