Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Создание XML с кириллицей через DOM

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
NeuroZ
Отправлено: 29 Ноября, 2016 - 10:43:24
Post Id



Посетитель


Покинул форум
Сообщений всего: 393
Дата рег-ции: Апр. 2012  


Помог: 2 раз(а)




Всем привет! Проблема с формированием файла выгрузки для 1С.
PHP:
скопировать код в буфер обмена
  1. $dom = new DOMDocument('1.0', 'windows-1251');
  2. $date = date("Y-m-d", time());
  3. $root = $dom->createElement(iconv('cp1251', 'utf-8', '<КоммерческаяИнформация ВерсияСхемы="2.03" ДатаФормирования="' . $date . '">'));
  4. $dom->appendChild($root);

Это начало файла. PHP ругается: Fatal error: Uncaught DOMException: Invalid Character
Как быть?
 
 Top
Sail
Отправлено: 29 Ноября, 2016 - 12:22:24
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




Кириллица тут ни при чём.
Есть тег, есть атрибуты...
Есть пример.
 
 Top
NeuroZ
Отправлено: 29 Ноября, 2016 - 13:02:33
Post Id



Посетитель


Покинул форум
Сообщений всего: 393
Дата рег-ции: Апр. 2012  


Помог: 2 раз(а)




Sail пишет:
Есть тег, есть атрибуты...

Блин! Точно... запарка)) спасибо))
 
 Top
NeuroZ
Отправлено: 30 Ноября, 2016 - 10:51:51
Post Id



Посетитель


Покинул форум
Сообщений всего: 393
Дата рег-ции: Апр. 2012  


Помог: 2 раз(а)




Обнаружил новые грабли...
Цитата:
This page contains the following errors:
error on line 2 at column 1: Encoding error
Below is a rendering of the page up to the first error.

Эту ошибку выдает браузер при попытке открыть файл на сервере (файл во вложении), там всего 2 строчки.

Из наблюдений:
1. Если этот файл открыть на локальном сервере - то никаких ошибок нет.
2. Если на сервере вместо русских букв написать латиницу - то файл открывается без ошибок.

Для построения использую DOM:
PHP:
скопировать код в буфер обмена
  1. $dom = new DOMDocument('1.0', 'windows-1251');
  2. $date = date("Y-m-d", time());
  3. $root = $dom->createElement('КоммерческаяИнформация');
  4. $root->setAttribute('ВерсияСхемы', '2.03');
  5. $root->setAttribute('ДатаФормирования', $date);
  6. $dom->appendChild($root);
  7. $dom->save(JPATH_BASE . '/media/orders/order.xml');

(Добавление)
Также хочу заметить (возможно это поможет) - сам файл открыт в кодировке utf-8. Но если делать преобразование
PHP:
скопировать код в буфер обмена
  1. $text = mb_convert_encoding('КоммерческаяИнформация', 'windows-1251');
  2. $root = $dom->createElement($text);

То появляется ошибка "Invalid Character Error"
(Добавление)
И все равно больше всего смущает разное поведение на сервере и на локалке... Может надо что-то где-то настроить в самом конфиге сервера?
Скачать файл: order-site.xml
Скачан раз: 48
 
 Top
Мелкий Супермодератор
Отправлено: 30 Ноября, 2016 - 11:20:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Емнип, dom подобно simplexml с PHP разговаривает исключительно на utf8. В другие кодировки конвертирует при формировании текстового представления save или saveXML.

NeuroZ пишет:
Если этот файл открыть на локальном сервере - то никаких ошибок нет.

Посмотрите в заголовки HTTP-ответа. Может там идёт content-type с utf8, и браузер верит заголовку, а не самому xml


-----
PostgreSQL DBA
 
 Top
NeuroZ
Отправлено: 30 Ноября, 2016 - 11:34:12
Post Id



Посетитель


Покинул форум
Сообщений всего: 393
Дата рег-ции: Апр. 2012  


Помог: 2 раз(а)




Вот что в source сервера:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?xml version="1.0" encoding="windows-1251"?>
  2. <&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; &#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;="2.03" &#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;="2016-11-30"/>

Нажимаю ctrl+s. Сохраняю на локалке. Открываю. Вот source локалки:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?xml version="1.0" encoding="windows-1251"?>
  2. <КоммерческаяИнформация ВерсияСхемы="2.03" ДатаФормирования="2016-11-30"/>
  3.  

(Добавление)
вместо ;&#65533 - черные ромбы (плохая кодировка).
Вопрос - как заставить файл на сервере открываться в нужной мне кодировке?
 
 Top
Мелкий Супермодератор
Отправлено: 30 Ноября, 2016 - 11:39:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Я про заголовки спросил.
Что вашему браузеру сносит крышу - это и так уже понятно. Теперь надо понять, от чего именно ему сносит крышу. Основной кандидат - в заголовках ответа.


-----
PostgreSQL DBA
 
 Top
NeuroZ
Отправлено: 30 Ноября, 2016 - 11:39:32
Post Id



Посетитель


Покинул форум
Сообщений всего: 393
Дата рег-ции: Апр. 2012  


Помог: 2 раз(а)




В общем сервер по дефолту открывает все страницы в UTF-8. Если в ручную через настройки браузера поставить Кириллицу Windows-1251, То ошибок нет и файл корректно открывается.
Соответственно как сделать так, чтобы файл по умолчанию открывался в нужной кодировке?
(Добавление)
Я просто не совсем пойму как мне задать конкретные заголовки при прямом обращении к XML файлу
(Добавление)
Мелкий пишет:
Может там идёт content-type с utf8, и браузер верит заголовку, а не самому xml

Так скорей всего и есть (я вообще не вижу заголовка с кодировкой) - значит используется дефолтный (utf-8). Так как заставить читать windows-1251 (в конкретном случае) ?

(Отредактировано автором: 30 Ноября, 2016 - 11:48:10)

 
 Top
Мелкий Супермодератор
Отправлено: 30 Ноября, 2016 - 11:49:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)






-----
PostgreSQL DBA
 
 Top
Sail
Отправлено: 30 Ноября, 2016 - 11:53:12
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




NeuroZ, для чего "заставлять" браузер? Файл ведь выгружается в соответствии с каким-то протоколом для определенной цели и должен правильно обрабатываться "на другой стороне". И вряд-ли этой "другой стороной" является браузер...
 
 Top
NeuroZ
Отправлено: 30 Ноября, 2016 - 12:03:08
Post Id



Посетитель


Покинул форум
Сообщений всего: 393
Дата рег-ции: Апр. 2012  


Помог: 2 раз(а)




Sail пишет:
для чего "заставлять" браузер? Файл ведь выгружается в соответствии с каким-то протоколом для определенной цели и должен правильно обрабатываться "на другой стороне". И вряд-ли этой "другой стороной" является браузер...

Ну я об этом тоже думал... Я хотел бы предотвратить возможные ошибки. Например если клиент предпочитает не скачивать файл и работать с ним у себя на машине, а, например, парсить напрямую из браузера (аля работать с файлом на сервере) - то у него ничего не получится..
(Добавление)
Мелкий пишет:
http://nginx[dot]org/ru/docs/http/ng[dot][dot][dot]rset_module[dot]html

В обычных страницах есть соответствующий заголовок:
Content-Type:text/html; charset=utf-8
xml стоит просто Content-Type:text/xml;

В общем удалил из конфига nginx для данного сайта принудительную кодировку

и все заработало

Всем спасибо, за советы!

(Отредактировано автором: 30 Ноября, 2016 - 13:24:21)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB