![]() |
Модераторы: Aliance, skyboy, MoLeX, ksnk |
![]() ![]() ![]() |
|
dm9 |
|
|||
![]() Дмитрий Копытин ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 3876 Регистрация: 22.7.2002 Где: Москва Репутация: 1 Всего: 137 |
Расскажите, как разобраться с кодировками в DOMXML? Задача - сделать селект из БД, положить селектированное значение в какой-нибудь атрибут в ДОМ-дереве, распечатать это дерево. (XSLT нам пока не нужен
![]() Сначала я хотел везде использовать 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>"; На выходе имеем лажу типа Русский Нет, это именно то самое русское слово, которое я туда записал, но я хотел бы получить его не в юникоде, а в UTF-8... без дополнительного преобразования. Можно сделать дерево не через domxml_new_doc('1.0'), а таким образом: $this->xml = domxml_open_mem('<?xml version="1.0" encoding="UTF-8" ?><root/>'); Но тут на выходе получается совсем что-то непонятное... В общем, всё, конечно, можно получить, но мне не хочется гонять данные из кодировки в кодировку, не хочется делать преобразование Юникод(&#xxx;)->UTF8, а хочется иметь всё в одном формате, и в нём работать. Так вот, вопрос основной: как же это сделать? |
|||
|
||||
dm9 |
|
|||
![]() Дмитрий Копытин ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 3876 Регистрация: 22.7.2002 Где: Москва Репутация: 1 Всего: 137 |
Ой, а какая жуть с кодировками там после XSLT-преобразования получается...
|
|||
|
||||
dm9 |
|
|||
![]() Дмитрий Копытин ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 3876 Регистрация: 22.7.2002 Где: Москва Репутация: 1 Всего: 137 |
Всё, после преобразования разобрался - это htmlentities символы калечил
![]() Остаётся вопрос о том, как в результате работы $domxml->dump_mem(true) получить нормальные символы, а не &#xxx;, но это для меня уже не столь принципиально - это будет использоваться только для отладки сайта, поэтому имеет право на существование. Добавлено @ 17:58 Но всё в UFT-8. Так что вопрос про то, можно ли генерить дерево в Win1251, остаётся открытым. Это сообщение отредактировал(а) dm9 - 29.9.2005, 17:58 |
|||
|
||||
Sardar |
|
||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 1 Всего: 317 |
XML DOM дерево всегда хранит строки в юникоде(UCS2), но так как PHP не имеет 16 битного char, приходиться ложить всё в UTF-8. Заставить дерево хранить текст в других кодировках нельзя - противоречит стандарту. НО! можно через XSLT указать: xsl:output encoding = "windows-1251" и получить сериализованное дерево в заданной кодировке. Как только ты потом это дерево опять в DOM загрузишь, всё опять будет в юникоде ![]()
Что за жуть? ![]() Вопрос: в чём проблема UTF-8? Нет такого браузера что бы UTF-8 не понимал. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||
|
|||||
dm9 |
|
||||
![]() Дмитрий Копытин ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 3876 Регистрация: 22.7.2002 Где: Москва Репутация: 1 Всего: 137 |
Сардар, спасибо за комментарий. А можно чуть глубже, почему по стандарту нельзя хранить дерево в произвольной кодировке? Просто мне странно кажется - XML и XSL должны быть в UTF-8, а затем мы его перегоняем в Win. Как-то неоптимально... если у меня всё в Win, лишний раз туда-сюда текст гонять как-то некрасиво...
Уже разобрался, см. выше ![]()
Для русских сайтов - увеличение объёма страницы в 1,5-2 раза. Это сообщение отредактировал(а) dm9 - 29.9.2005, 19:14 |
||||
|
|||||
Sardar |
|
||||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 1 Всего: 317 |
Для того что бы не иметь проблем при взаимодействии различного софта. Строго говоря всё должно в UTF-16 лежать. http://www.w3.org/TR/2000/WD-DOM-Level-1-2....html#DOMString
Проверь, замерь потери времени, обычно перекодировка это быстрая операция, т.к. не требует особых вычислений и выполняеться за O(n) (константное для символа, по таблице) время. Для скриптов это вообще не вопрос ![]()
Разве это такая проблема? Обычно не требуеться отдавать массу текста, не малый обьём в разметке, а там как раз UTF-8 в один байт. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||||
|
|||||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: X технологии | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |