XML-файлы в кодовой таблице Windows-1251

Программы на Clarion, шаблоны, библиотеки и пр.

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Здравствуйте, господа!

Честно говоря, не знаю, кому может пригодиться ...

Мне надо было генерировать (для заказчика) и читать (от заказчика) XML в кодовой таблице Window-1251.

1. Опишем русскую кодировку в CPXML.Inc

Код: Выделить всё

XMLEnc               EQUATE(STRING)
XMLEnc:UTF8          EQUATE('UTF-8')
XMLEnc:UTF16         EQUATE('UTF-16')
XMLEnc:ISO88591      EQUATE('ISO-8859-1')
XMLEnc:WIN1251       EQUATE('WINDOWS-1251')
2. И заставим выводить данные в windows-1251 (CpXML.clw)

DOMToXMLFile procedure(*Document doc, string path, <*CSTRING newLine>, UNSIGNED Format = Format:AS_IS)

Код: Выделить всё

ret         BYTE
            CODE
            IF omitted(3)
                !ret=DOMToXMLFile(doc,path,,Format,XMLEnc:UTF8)
                ret=DOMToXMLFile(doc,path,,Format,XMLEnc:WIN1251)
            ELSE
                !ret=DOMToXMLFile(doc,path,newLine,Format,XMLEnc:UTF8)
                ret=DOMToXMLFile(doc,path,newLine,Format,XMLEnc:WIN1251)
            END
            RETURN ret
3. После чего получим XML-файл (например, в Example\XMLParse) в кодировке Windows-1251, вполне отображаемый браузером. Но встаёт другая проблема - эти файлы не читаются кларионовским парсером (Шаблон 'View XML File' просто падает при загрузке). Ну что ж, тем хуже для парсера. Возьмём шестнадцатеричный редактор, найдём в модуле C60cpxml.dll текст 'ISO-8859-1', заменим на 'WINDOWS-1251' и добавим в конец '<0>' .

4. Вопрос с документами в UTF-8 не рассматривается :(

---------------------------------------
C уважением,
Юрий Философов,
Главный программист
Корпорация "Диполь", Саратов
E-mail yufil@tacis-dipol.ru (служ)
yufil@mail.ru (дом)
ICQ#75924439

(Добавление)

Когда-то мне пришлось более плотнее исследовать C6 XML Support. Сделал точно такие же изменения как Вы.
3. После чего получим XML-файл (например, в Example\XMLParse) в кодировке Windows-1251, вполне отображаемый браузером.
Когда получил этот результат - обрадовался. Но попробовал, используя их классы создать свой XML, и очень разочаровался. Оказывается, классы напрочь отказываются работать с русскими тегами.
Но встаёт другая проблема - эти файлы не читаются кларионовским парсером (Шаблон 'View XML File' просто падает при загрузке). Ну >что ж, тем хуже для парсера.
Может проблема в кодовой странице, о которой писал Сергей Артюшенков.
Возьмём шестнадцатеричный редактор, найдём в модуле C60cpxml.dll текст 'ISO-8859-1', заменим на 'WINDOWS-1251' и добавим в конец '<0>' .
Я не понял, тогда в этом случае все O'K, что ли?

С уважением, Семен Попов
Когда получил этот результат - обрадовался. Но попробовал, используя их классы создать свой XML, и очень разочаровался. Оказывается, классы напрочь отказываются работать с русскими тегами.
Пофиксил. Теперь работают :)
Когда получил этот результат - обрадовался. Но попробовал, используя их классы создать свой XML, и очень разочаровался. Оказывается, классы напрочь отказываются работать с русскими тегами.
А за это отвечает процедура CheckXMLName из CpXML.clw . Можно поставить в первую строку Return(0) - и будут приниматься любые теги :)

---------------------------------------
C уважением,
Юрий Философов

Спасибо, попробую.

С уважением, Семен Попов
Когда-то мне пришлось более плотнее исследовать C6 XML Support. Сделал точно такие же изменения как Вы.
Это естественно. Но сгенерированные файлы не читались через Support. Потратил время, чтобы понять причину и добить, как заставить их читаться. О чём и рассказал :)
Я не понял, тогда в этом случае все O'K, что ли?
По крайней мере, файлы, созданные обычным текстовым редактором или сформированные программой (в том числе без использования интерфейса) читаются, только и всего. Просто похоже, что используемая библиотека в принципе не поддерживает кодировок, отличных от буржуинских, а это самый простой путь заставить это делать...

... исправленные модули для CW6.1 на http://www.tacis-dipol.ru/fil/XML1251.zip

---------------------------------------
C уважением,
Юрий Философов
Написал: ClaList(2)
Гость

Сообщение Гость »

Кстати, вместо "WINDOWS-1251" можно использовать "MS1251" - такой синтаксис тоже понимают все системы.
Этим самым экономится длина строки (ISO-8859-1 - 10 знаков, WINDOWS-1251 - 12 знаков) при бинарном рпедактировании.

Igor Smirnov igor.smirnov@documentum.ru

Увы, это строка проверяется при вводе, а не выводе :( Поэтому приходится пожертвовать следующим полем - US-ASCII ...

---------------------------------------
C уважением,
Юрий Философов

Ну, у Клариона я не проверял, к сожалению.
У меня был аналогичный случай по основной работе (программные продукты Documentum).
Мы тоже очень долго мучились с проблемой замены в бинарном файле "ISO_8859-1" на название русской кодировки. Мучились как раз из-за ттго, что нужно было уложиться "байт в байт". Проверяли все возможные варианты синтаксиса (кстати, кроме "Windows-1251" еще есть варианты "1251", "CP-1251", "ANSI-1251" и другие).
В итоге долгих экспериментов выяснилось, что "MS1251" читается даже, например, Интернет-Эксплорером.
Собственно говоря, можете проверить - замените в метатеге какой-нибудь HTML-страницы "Windows-1251" на "MS1251" - бедет работать.

Игорь Смирнов

Да речь не о Кларионе. Просто для создания DLL использовалась некая сишная библиотека. А в ней есть список допустимый кодовых таблиц, и Windows-1251 в ней НЕТ. Происходит чтение XML и поиск наименования кодовой страницы в списке. Ещё раз - это важно при ЧТЕНИИ XML-файла через кларионовский Support.

И если файл начинается на

Код: Выделить всё

<?xml version="1.0" encoding="WINDOWS-1251"?>
,
то именно 'WINDOWS-1251' и должен быть в программе. Собственно, путём двухдневных хакерских "экспериментов" и был найден такой вариант.
Возможно, что можно подменить и другие текстовые строки. Кто займётся?

Кстати, попробовал CP-1251 и MS1251, браузер показал ошибку . Файл прилагается.

А вот список кодовых таблиц кириллицы из MSDN

Имя обозначение (алиасы)
Cyrillic (DOS) cp866 ( ibm866 )
Cyrillic (ISO) iso-8859-5 (csISOLatin5, csISOLatinCyrillic, cyrillic, ISO_8859-5, ISO_8859-5:1988, iso-ir-144, l5)
Cyrillic (KOI8-R) koi8-r (koi8-ru)
Cyrillic (KOI8-U) koi8-u
Cyrillic (Windows) windows-1251 (x-cp1251)

---------------------------------------
C уважением,
Юрий Философов

(Добавление)
Кстати, попробовал CP-1251 и MS1251, браузер показал ошибку .
Файл прилагается.
Действительно, выдает ошибку.
Получается, что для обычного HTML это работает, а для XML - нет.
Ну, Билл Гейтс - все запутал!

Igor Smirnov igor.smirnov@documentum.ru
Написал: ClaList(2)
Гость

Сообщение Гость »

Здравствуйте, всем!

C6 Build 9025, ABC

В продолжение темы:
Заменил файлы, исправленные Юрием Философовым.

Создал простенький пример:

Код: Выделить всё

CC       BYTE
xmlExch XMLExchange
xmlNav  CLASS(XMLNavigator)
Parse        PROCEDURE ! Разбор XML
               END
  CODE
     CC = xmlExch.OPEN('xmlexam.xml')
     IF (CC)
          MESSAGE('Reading Error ' & CC)
     ELSE
          MESSAGE('Reading OK')
          xmlNav.Init(xmlExch)
          xmlNav.getXMLExchangeNo de
          MESSAGE('Корневой Тег: ' & xmlNav.getNodeName())
          ! Разбор XML
          xmlNav.Parse
     END

xmlNav.Parse PROCEDURE
 CODE
  IF ~(SELF.goToFirstChild())
     MESSAGE(SELF.getNodeName() & ': ' & GetElementText(SELF.CurrentNode))
     SELF.Parse
  ELSE
     RETURN
  END
  LOOP
   IF (SELF.goToNextSibling())
      SELF.goToParent()
      BREAK
   ELSE
      MESSAGE(SELF.getNodeName() & ': ' & GetElementText(SELF.CurrentNode))
      SELF.Parse
   END
  END
Выяснилось, что не проходит чтение XML-файлов с русскими тегами, в которых в наименовании присутствуют буквы "ё" или "ч", независимо от регистра. Метод OPEN класса xmlExchange выдает ошибку CPXMLErr:XMLReadFail.
Что это? Одно из ограничений XML или ошибка С6? А может у меня неверный подход?

Вот пример xmlexam.xml, который успешно читается:

Код: Выделить всё

<?xml version="1.0" encoding="WINDOWS-1251"?>
<НекиеДанные>

<абвгдежзийклмнопрстуфхцшщьыъэюя>абвгдеёжзийклмнопрстуфхцчшщьыъэюя</абвгдежзийклмнопрстуфхцшщьыъэюя>

<АБВГДЕЖЗИЙКЛМНОПРСТУФХЦШЩЬЫЪЭЮЯ>АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ</АБВГДЕЖЗИЙКЛМНОПРСТУФХЦШЩЬЫЪЭЮЯ>
</НекиеДанные>
Добавьте в наименование любого тега буквы "ё" или "ч" и получите ошибку.

С уважением, Семен Попов

(Добавление)

Не, подход вполне... Можно ещё проще - есть такой Embed - XML Tree View, просто поставить в приложение и любоваться... Вряд ли это от XML, потому как браузер показывает без вопросов. Скорее проблема в Sax Parser :(

---------------------------------------
C уважением,
Юрий Философов
Действительно, выдает ошибку.
Получается, что для обычного HTML это работает, а для XML - нет.
Ну, Билл Гейтс - все запутал!
Вообще-то, дядюшка Билл тут ни при чем...
Все эти дела регламентируются стандартами.
В частности, что касается кодировки 1251, можно посмотреть правду вот в этом источнике: http://www.iana.org/assignments/character-sets

Name: windows-1251
MIBenum: 2251
Source: Microsoft (http://www.iana.org/assignments/charset ... ndows-1251) [Lazhintseva]
Alias: None

Ессно, Микрософт приложил руку к регистрации этого типа, но хаять их за то, что они не хотят в хмл понимать CP-1251 и MS1251 не стоит.

Вот, собсно, и все, что хотел сказать :)))
--
Best regards,
Sergei mailto:asn@arsis.ru

Написал: ClaList(2)
Гость

Сообщение Гость »

Добавьте в наименование любого тега буквы "ё" или "ч" и получите ошибку.
Кстати, проверил эту ситуацию на стандартном примере в поставке C6 - Examples\xmlParse. Добавил в таблице people поле с русским наименованием (нехорошо конечно) и сконвертил её. Далее скомпилил приложение под измененный DCT.
Проверил выгрузку по всем трем вариантам - по карте, в виде атрибутов, в виде тегов. Получил положительный результат, т. е. буквы "ё" и "ч" не стали здесь преградой. Значит, проблемы с буквами только при чтении.

С уважением, Семен Попов
Написал: ClaList(2)
Ответить