Форум: "Прочее";
Текущий архив: 2014.11.09;
Скачать: [xml.tar.bz2];
Вниз"Проблема" кодировками в XML Найти похожие ветки
← →
sniknik © (2014-03-27 14:05) [0]Смысл, есть xml странной структуры, не наша, но нам(мне) нужно ее заполнить и отправить "владельцу". Странность в том, что в тегах одной xml-и "лежат" другие, а проблема в том, что у "родителя" кодировка utf8, а у вложенных win1251... в принципе, все было хорошо, пока в данных вложенных не появились русские слова... понятно в общем.
Вот пример<?xml version = "1.0" encoding = "UTF-8"?>
<tag>
<![CDATA[
<?xml version="1.0" encoding="windows-1251"?>
<tag>Тест русские символы</tag>
]]>
</tag>
И вопрос, можно ли что нибудь с этим сделать? Ну в смысле не в base64/другие транспортные кодировать, а получателя заставить раскодировать... это не возможно (не будут ничего менять). А вот так чтобы стандартными средствами (ie чтобы открывал), типа как раздел CDATA заставляет игнорировать разметку в нем, так же чем нибудь заставить не выдавать ошибку "неверный символ" если внутри CDATA текст в отличной от "родителя" кодировки (раздел BINARYDATA бы подошeл ;)).
p.s. надежды на решение почти нет... вопрос чисто на всякий случай, а вдруг, чтобы сказать "я сделал все что мог" :), перед тем как отказывать.
← →
Дмитрий СС (2014-03-27 14:22) [1]Не совсем понятно чего добиться то нужно? Чтобы IE открывал? Или файл подготовить корректно?
У меня была похожая проблема с ISD, когда она 1251 XML-ку передавали через UTF-ный SOAP.
Я "пошаманил" со всякими UTFEncode/Decode и в итоге добился результата.
Но задачи открывать в IE не стояло, конечно, но и возможности отказаться не было.
← →
имя (2014-03-27 14:28) [2]Удалено модератором
← →
имя (2014-03-27 14:32) [3]Удалено модератором
← →
sniknik © (2014-03-27 14:34) [4]> Не совсем понятно чего добиться то нужно? Чтобы IE открывал?
Фактически да, ie откроет значит все пройдет. Т.к. читают содержимое тегов стандартным IDOM документом.
> Или файл подготовить корректно?
С точки зрения "бизнеса" файл корректен, именно в том виде, что нужен. Проблема в "технике" которая так не считает.
> Я "пошаманил" со всякими UTFEncode/Decode и в итоге добился результата.
Ты маладец, только читать не умеешь...
> не в base64/другие транспортные кодировать, а получателя заставить раскодировать... этоне возможно
Структура/кодировка каждой части должна остаться, что есть, они идут в разные места, и каждый хочет "по своему". Нужен метод записать так чтобы в чтении ничего не менять (не наша часть). но тем не менее прочиталось то что нужно.
← →
sniknik © (2014-03-27 15:02) [5]> и уже результирующий XML парсишь
Парсинг/чтение менять нельзя. Он не в моих руках. Только составление/запись.
> Можно вообще изменить декларацию на кодировку utf16 - и не париться
Нет нельзя, внутренняя часть тогда тоже будет в ней, а там явно указано, и должно быть win1251.
← →
имя (2014-03-27 15:06) [6]Удалено модератором
← →
sniknik © (2014-03-27 15:14) [7]> ну дак переконверти отдаваемую CDATA строку в windows-1251. Что сложного то?
А ты открой в ie/... пример из [0] увидишь что. Он в исходных именно в 1251, без переконвертаций.
← →
Дмитрий СС (2014-03-27 15:17) [8]
> Ты маладец, только читать не умеешь...
Ну удачи вам
← →
Inovet © (2014-03-27 15:25) [9]> [7] sniknik © (27.03.14 15:14)
> Он в исходных именно в 1251, без переконвертаций.
Может, Профессор про предварительную конвертацию напильником в тегах
<![CDATA[
<?xml version="1.0" encoding="windows-1251"?>
<tag>Тест русские символы</tag>
]]>
в UTF-8. Ну, как бы файл должен быть в одной кодировке, а потом уже обратно напильником. в windows-1251.
← →
clickmaker © (2014-03-27 15:25) [10]> А ты открой в ie/...
а на фига открывать заведомо кривой хмл в ие?
← →
имя (2014-03-27 15:45) [11]Удалено модератором
← →
sniknik © (2014-03-27 16:00) [12]> а потом уже обратно напильником. в windows-1251.
Если бы напильник был у меня в руках, а так... Я тут только потому, что работать перестало (понятно почему, пока в названиях был только английский текст, все эти заголовки были не существенны)
> а на фига открывать заведомо кривой хмл в ие?
Для проверки... если удастся как-то "соблюсти" и открыть то за задание можно браться, если нет... ну на нет и суда нет.
> Согласно правилам XML там лежат русские символы в кодировке utf8
Вопрос не о правилах, я их и сам знаю, и доки по ним есть, а о том можно ли их обойти.
← →
Inovet © (2014-03-27 16:03) [13]Скопировал из [0] в файл 1.xml в кодировке UTF-8. Всё открылось... Так что напильник помогает.
← →
Inovet © (2014-03-27 16:04) [14]> [12] sniknik © (27.03.14 16:00)
> Если бы напильник был у меня в руках, а так...
А, вон как оно.
← →
имя (2014-03-27 16:18) [15]Удалено модератором
← →
sniknik © (2014-03-27 17:02) [16]> посмотрим, чё у тебя там за символы
[0]
← →
имя (2014-03-27 17:07) [17]Удалено модератором
← →
sniknik © (2014-03-27 17:14) [18]> все символы windows-1251 без всяких UTF-8 и BOM
Именно так и должно быть 1251, для внутреннего, а для внешнего в utf-8. Условие такое. "ТЗ".
Файла нет. Его нужно сделать и отправить... правила определены "бизнесом" (который уверен, что xml универсален, понимается это ими так, что пихать туда можно что угодно и как угодно "он умный, он поймет", ну и + "всегда работало именно с такими заголовками").
Сможешь "извернуться"? Могу свести с заказчиком, денег заработаешь... (не за xml, задача обширнее, xml это "камень преткновения") платят обычно нормально. Сколько за эту еще не знаю, на первом знакомстве с ТЗ остановился.
← →
sniknik © (2014-03-27 17:18) [19]Работало вот так, тоже формировали "типа в 1251" (с браузера пойдет) -
<?xml version = "1.0" encoding = "UTF-8"?>
<tag>
<![CDATA[
<?xml version="1.0" encoding="windows-1251"?>
<tag>Test russian symbols</tag>
]]>
</tag>
← →
имя (2014-03-27 17:22) [20]Удалено модератором
← →
sniknik © (2014-03-27 17:37) [21]Удалено модератором
← →
имя (2014-03-27 17:45) [22]Удалено модератором
← →
sniknik © (2014-03-27 18:20) [23]Не пойдет на устройство "ушла" строка "Тест СЂСѓСЃСЃРєРёРµ символы</"
← →
имя (2014-03-27 18:23) [24]Удалено модератором
← →
clickmaker © (2014-03-27 18:24) [25]> [23] sniknik © (27.03.14 18:20)
так а какие варианты? как может быть в одном файле текст в 2 разных кодировках, чтобы при этом он нормально читался без перекодирования?
← →
sniknik © (2014-03-27 18:28) [26]+
При расширении (добавлении тега c русским) в "основной" xml в ответ та же ошибка - "неверный символ" но уже на этот тег.
Добавленный BOM не панацея в общем.
← →
sniknik © (2014-03-27 18:32) [27]> как может быть в одном файле текст в 2 разных кодировках, чтобы при этом он нормально читался без перекодирования?
Ну например команда вместо CDATA типа BYNARY(150, "и тут 150 байт чего угодно .... "). Если бы была.
Да понятно все в общем, спрашивал все одно на "а вдруг?", но чудес не бывает ;(.
← →
clickmaker © (2014-03-27 18:34) [28]> команда вместо CDATA типа BYNARY
такая "команда" называется base64
← →
sniknik © (2014-03-27 18:39) [29]> такая "команда" называется base64
Блин, это я первым делом предложил. Нельзя, "та сторона" рас-кодировки не делает. (софт не русский, и очень старый, те кто писал похоже вообще не знали ничего кроме английского)
← →
sniknik © (2014-03-27 18:45) [30]> тогда у вас неправильный парсер
> попробуй так
> http://gfile.ru/a85iu
Парсер не у меня, с первого поста об этом твержу, был бы мой проблем не было (я бы вообще всю xml по другому сделал, без вложенных).
Тоже не работает, с почти той же ошибкой "недопустимый знак" (а не символ :)).
← →
Inovet © (2014-03-27 18:55) [31]> [30] sniknik © (27.03.14 18:45)
> Тоже не работает
Осталось в качестве эксперимента проверить на предмет понимания русскости вообще. Замени в заголовке
> [30] sniknik © (27.03.14 18:45)
> http://gfile.ru/a85iu
UTF-8 на windows-1251
← →
это все... (2014-03-27 20:02) [32]Фактически да, ie откроет значит все пройдет. Т.к. читают содержимое тегов стандартным IDOM документом.
В чем тогда проблема?
внутри документа и внутри cdata - все в утф-8
в прологе документа - утф-8
или
внутри документа и внутри cdata - все в 1251
в прологе документа - 1251
в псевдо-прологе вложенного в cdata документа - то, чего они попросят.
ие такой документ откроет на ура. задача решена.
PS
Вангуя могу еще такое сказать:
Загрузив основной док, который будет такой как описано выше, они дернут содержимое CDATA в стоку
а потом сделают на ней loadXML()
так вот.
кодировка в прологе в этом случае вообще нафик не сдалась и ее можно опустить.
и не только ее но и сам пролог тоже.
достаточно будет самого тела.
<root>......</root>
← →
это все... (2014-03-27 20:13) [33]в качестве иллюстрации примеры:
xdoc := CoDomDocument.create;
xdoc.loadXML("<мама_мыла_раму/>");
xdoc.save("c:\utf8-default.xml");
xdoc.loadXML("<xml version="1.0" encoding="windows-1251"?><мама_мыла_раму/>");
xdoc.save("c:\1251-explicit.xml");
xdoc.loadXML("<xml version="1.0" encoding="utf-8"?><мама_мыла_раму/>");
xdoc.save("c:\utf-8-explicit.xml");
затем far + f3 для всех трех файлов и смотрим что выгрузилось
1-утф
2-1251
3-утф
← →
имя (2014-03-27 21:18) [34]Удалено модератором
← →
это все... (2014-03-27 21:27) [35]уберите пролог документа из cdata вообще.
или уберите только кодировку из него.
← →
sniknik © (2014-03-28 08:08) [36]> Замени в заголовке
>> [30] sniknik © (27.03.14 18:45)
>> http://gfile.ru/a85iu
> UTF-8 на windows-1251
Работает.
> В чем тогда проблема?
Читай сначала. сверху должен быть utf-8 внутри 1251, реальные, и никак иначе, именно в таком виде действительна первая проверка в ie. все остальные варианты "корявят" русский текст (выше есть), или дают ошибку (начало).
> Очевидно в одном из элементов цепи преобразований есть ошибка, противоречащая правилам XML.
Очевидно. Я эту ошибку с самого начала описал. Сам "стиль" формирования ошибочен.
> в каком виде получаешь данные
НЕ получаю. Только ОТПРАВЛЯЮ. Сколько раз одно и то же? Считай получателем "черный ящик" (что не далеко от истины).
> Но я сомневаюсь, что ты справишься с задачей описания достойно :)
Я на задачу "не подписался", т.что пофиг.
> уберите пролог документа из cdata вообще.
> или уберите только кодировку из него.
по умолчанию подставляется utf-8. ну или что-то подобное, т.к. убирание у "внутреннего" возвращает туже ошибку (не верный символ в строке ...), а у внешнего, результат читается, но все русские буквы замещаются знаками вопросов.
← →
sniknik © (2014-03-28 08:18) [37]> уберите пролог документа из cdata вообще.
> или уберите только кодировку из него.
+
Еще странность, если убрать у "внешнего" весь заголовок - <?xml version = "1.0" encoding = "UTF-8"?>, то открытие "тупит" по страшному почему то, т.е. с ним открывает за секунду, а без ~ 5 мин...
Забавно.
← →
это все ... (2014-03-28 08:29) [38]Удалено модератором
← →
sniknik © (2014-03-28 09:35) [39]> кроме этого там сказано, что если ие проглотит документ, то будет все ок.
Там сказано "фактически да если ie откроет ...", но сказано не в вакууме, а после перечисления условий которые никто не отменял.
> то исходный документ им надо тоже делать колхозным способом (например через файлстрим)
Спасибо КЭП, раньше никак не мог догадаться и почему это создавая через DOM такого как требуется никак не мог получить... (сарказм).
← →
имя (2014-03-28 10:02) [40]Удалено модератором
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2014.11.09;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.003 c