Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Преобразовать XML utf-8 в utf-16 вместе с заголовком / 25 сообщений из 64, страница 1 из 3
05.06.2020, 18:36
    #39966616
selis76
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
Есть сообщение xml сообщения в формате UTF-8 т.е. там из само сообщение и его заголовок с указанием версии
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
нужно сконвертировать XML в Utf-16 вместе с заголовком.

Самый легкий путь это конечно снести заголовок и просто перекодировать сообщение в UTF-16 как текст, но хотелось бы более технологичный вариант.

Напр через JAXP через парсер считать XML (без DOM просто Simple API ), и перевести в другую кодировку.
В документации JAXP и поиском хорошего варианта я не нашел.

Задача относится к известной проблеме - как сохранить Utf-8 в колонку MS SQL с типом XML . MS SQL хранит все в UTF-16, а сообщение приходит в UTF-8

Я сначала думал что SQLXML может сам преобразовать, но ошибался .
Код: java
1.
2.
3.
    String messagetext = new String(body, "UTF-8");
                  SQLXML TrueXML = QJDBCConnect.createSQLXML() ;
                    TrueXML.setString(messagetext);



Выдаст "XML parsing: line 1, character 38, unable to switch the encoding"

Самое удивительное если сообщение передать в UTF-8 но заголовок поправить на encoding="UTF-16" передача в SQl пройдет нормально. Возможно из за того что Java хранит строки внутри в Utf-16 по некоторым источникам.
В общем хотелось бы услышать Best practice , не хочется писать костыли
...
Рейтинг: 0 / 0
05.06.2020, 18:45
    #39966620
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
selis76,
Делай как проще. Сама задача есть костыль.
А ты думаешь как костыль сделать технологичнее)))
...
Рейтинг: 0 / 0
05.06.2020, 18:57
    #39966624
selis76
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
PetroNotC Sharp
selis76,
Делай как проще. Сама задача есть костыль.
А ты думаешь как костыль сделать технологичнее)))

Ну это странно, что сама задача костыль вроде перекодировка в более широкую кодировку не является криминалом.
Мне потом для Win-1251 тоже отдельный костыль писать?
...
Рейтинг: 0 / 0
05.06.2020, 19:06
    #39966626
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
selis76,
Костыль или нет задача мы поймем если ты напишешь откуда появляется кодировка НЕ ТА ЧТО ТРЕБУЕТСЯ.
...
Рейтинг: 0 / 0
05.06.2020, 19:11
    #39966628
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
selis76,
Сиквел хранит только в utf 16, а приходят извне нас utf 8.
Так?
...
Рейтинг: 0 / 0
05.06.2020, 19:19
    #39966634
selis76
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
PetroNotC Sharp
selis76,
Сиквел хранит только в utf 16, а приходят извне нас utf 8.
Так?

да
Сообщения приходят из шины RabbitMQ, кодировка сообщения известна. Я их сохраняю в свой буфер, буфер на MSSQL он XML хранит в UTF16.
При маштабировании могут появляться новые кодировки
...
Рейтинг: 0 / 0
05.06.2020, 19:24
    #39966639
Valentin Kolesnikov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
selis76
Есть сообщение xml сообщения в формате UTF-8 т.е. там из само сообщение и его заголовок с указанием версии
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
нужно сконвертировать XML в Utf-16 вместе с заголовком.

Самый легкий путь это конечно снести заголовок и просто перекодировать сообщение в UTF-16 как текст, но хотелось бы более технологичный вариант.

Напр через JAXP через парсер считать XML (без DOM просто Simple API ), и перевести в другую кодировку.
В документации JAXP и поиском хорошего варианта я не нашел.

Задача относится к известной проблеме - как сохранить Utf-8 в колонку MS SQL с типом XML . MS SQL хранит все в UTF-16, а сообщение приходит в UTF-8

Я сначала думал что SQLXML может сам преобразовать, но ошибался .
Код: java
1.
2.
3.
    String messagetext = new String(body, "UTF-8");
                  SQLXML TrueXML = QJDBCConnect.createSQLXML() ;
                    TrueXML.setString(messagetext);



Выдаст "XML parsing: line 1, character 38, unable to switch the encoding"

Самое удивительное если сообщение передать в UTF-8 но заголовок поправить на encoding="UTF-16" передача в SQl пройдет нормально. Возможно из за того что Java хранит строки внутри в Utf-16 по некоторым источникам.
В общем хотелось бы услышать Best practice , не хочется писать костыли


Underscore-java умеет читать xml строку в кодировке UTF-16.

Нужно прочитать строку в карту, поменять кодировку и сохранить в строку.

Хорошего вам вечера!
...
Рейтинг: 0 / 0
05.06.2020, 19:58
    #39966645
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
selis76,
И что? Не шина их перекодирует, а все 500 адаптеров пишут у себя код перекодировки?
Как то странно имхо.
...
Рейтинг: 0 / 0
05.06.2020, 20:17
    #39966649
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
selis76,
Дай ссыль что сиквел не умеет хранить другие кодировки.
Я нашел
https://docs.microsoft.com/ru-ru/sql/relational-databases/native-client/features/using-xml-data-types?view=sql-server-ver15
...
Рейтинг: 0 / 0
05.06.2020, 22:15
    #39966664
Dmitry.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
наличие xml заголовка типа <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
в java строке - абсурдно

т.к. для получения строки уже была использована кодировка

Код: java
1.
String messagetext = new String(body, "UTF-8");



т.е. если в body есть заголовок encoding="windows-1251" а ты применил "UTF-8", то ты поломал кодировку сообщения.

попробуй использовать TrueXML.setBinaryStream().write(body) вместо TrueXML.setString(messagetext)
...
Рейтинг: 0 / 0
08.06.2020, 07:26
    #39966966
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
selis76
PetroNotC Sharp
selis76,
Сиквел хранит только в utf 16, а приходят извне нас utf 8.
Так?

да
Сообщения приходят из шины RabbitMQ, кодировка сообщения известна. Я их сохраняю в свой буфер, буфер на MSSQL он XML хранит в UTF16.
При маштабировании могут появляться новые кодировки


Не делайте буфер на MS SQL.

Ну если делаете, то храните XML в BLOB-ах. :-)
...
Рейтинг: 0 / 0
08.06.2020, 08:03
    #39966974
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
mad_nazgul,
+1
Аффтар,
1. Вы не читаете что вам пишут. Сиквел хранит любую кодировку.
2. Не используйте сиквел.
Итого проблема высосана из пальца.
...
Рейтинг: 0 / 0
08.06.2020, 13:44
    #39967065
selis76
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
PetroNotC Sharp
mad_nazgul,
+1
Аффтар,
1. Вы не читаете что вам пишут. Сиквел хранит любую кодировку.
2. Не используйте сиквел.
Итого проблема высосана из пальца.


Petro - к сожалению вы не прочитали ту ссылку которую привели (я понимаю много букв) . Покажу пальцем.
https://docs.microsoft.com/ru-ru/sql/relational-databases/native-client/features/using-xml-data-types?view=sql-server-ver15
здесь описываются правила того как SQL сервер проводит конвертации в свой внутренний тип.
Возьмите напр раздел ODBC

"
When converting from C to SQL data types, SQL_C_WCHAR, SQL_C_BINARY, and SQL_C_CHAR can all be converted to SQL_SS_XML, with the following stipulations:

SQL_C_WCHAR: A BOM is always be added to data sent to the server. If the data already started with a BOM, this results in two BOMs at the start of the buffer. The server uses the first BOM to recognize the encoding as UTF-16 and then discard it. The second BOM is interpreted as a zero-width nonbreaking space character.

SQL_C_BINARY: No conversion is performed, and the data is passed to the server "as is." UTF-16 data must start with a BOM; if it does not, the encoding may not be correctly recognized by the server.

SQL_C_CHAR: The data is converted to UTF-16 on the client and sent to the server just as SQL_C_WCHAR (including the addition of a BOM). If the XML is not encoded in the client code page this can cause data corruption.
"

Про OleDB аналогично. Я думаю это достаточно для понимания что проблема существует и SQL сервер хранит XML тип в UTF-16.
Если спросите гугл "ms sql xml utf-8 utf-16 " там будет куча подобных проблем.

Больше я бы не хотел обсуждать постановку задачи, поскольку для меня проблема очевидна

P S Версия SQL у меня 2008r2 , в более старших там не лучше , кому интересно см тут https://techcommunity.microsoft.com/t5/sql-server/introducing-utf-8-support-for-sql-server/ba-p/734928 они расширили поддержку для строковых типов но для XML колонок нет
Кстати SQL вообще на внутренних типах сидит на UTF-16 на всех типах и только с 2019 го там начали UTF-8 внедрять
Более того Db2 тоже этим страдает https://www.ibm.com/support/knowledgecenter/SSEPEK_11.0.0/java/src/tpc/imjcc_c0021816.html
...
Рейтинг: 0 / 0
08.06.2020, 13:49
    #39967071
selis76
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
mad_nazgul


Не делайте буфер на MS SQL.

Ну если делаете, то храните XML в BLOB-ах. :-)


А зачем в SQL XML колонки как специальный тип? Подумали? .....
а ну конечно чтобы XMLQuery использовать XPath и вообще много чего интересного. Нельзя узко мыслить в современном мире, иначе XML будет восприниматься как обычный текст с тегами, без валидации по схеме и без применения стека XML технологий.
...
Рейтинг: 0 / 0
08.06.2020, 13:53
    #39967073
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
selis76
mad_nazgul


Не делайте буфер на MS SQL.

Ну если делаете, то храните XML в BLOB-ах. :-)


А зачем в SQL XML колонки как специальный тип? Подумали? .....
а ну конечно чтобы XMLQuery использовать XPath и вообще много чего интересного. Нельзя узко мыслить в современном мире, иначе XML будет восприниматься как обычный текст с тегами, без валидации по схеме и без применения стека XML технологий.

Вы правы наполовину.
Если используете запросы к XML, то дайте пример.
Если нет, то оверхед по архитектуре.
...
Рейтинг: 0 / 0
08.06.2020, 13:58
    #39967075
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
selis76,
Если для вас проблема с сиквелом очевидна, значит вам не трудно дать ссыль на нее с нашего форума по сиквелу?
...
Рейтинг: 0 / 0
08.06.2020, 14:00
    #39967076
selis76
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
PetroNotC Sharp

Вы правы наполовину.
Если используете запросы к XML, то дайте пример.
Если нет, то оверхед по архитектуре.

Perto прошу не участвовать в обсуждении, я не собираюсь рассказывать всю свою архитектуру для этого есть другой раздел форума
https://www.sql.ru/forum/systems-architecture . Как говорится не знаете ответа пройдите мимо
...
Рейтинг: 0 / 0
08.06.2020, 14:01
    #39967079
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
selis76

Самое удивительное если сообщение передать в UTF-8 но заголовок поправить на encoding="UTF-16" передача в SQl пройдет нормально. Возможно из за того что Java хранит строки внутри в Utf-16 по некоторым источникам.
В общем хотелось бы услышать Best practice , не хочется писать костыли

Несколько мыслей.

1) Непонятно зачем это делать. Utf-8 достаточно удобная кодировка. И должна быть поддержана всеми средствами
чтения текстовых документов.

2) Xml - это не просто текст. Это документ с множеством уровней или слоёв семантики и каждый раз когда вы его
процессите вы должны правильно реагировать на разные действия. Как-то реакция на XML-entities. Что делать?
Разворачивать или нет? Блоки обработки инструкций и стилевая транфсормация. Теоретически к документу
может быть пристёгнут скрипт xslt который что-то с ним делает при отображении. Будете-ли вы его тоже обрабатывать?
Или нет? Вопрос. Далее. Indentations, переводы строк и форматирование. Если документ внизу в footer содержит
ЭЦП тогда это действие надо делать аккуратно чтоб сигнатура не сломалась. Иначе документ станет с невалидной
подписью. Здесь я не готов пока приводить все аргументы но еще во времена развития SOAP были рекомендации
по тому как вычислять ЭЦП с учотом например пробелов или переносов в меж-теговом пространстве. И разные
парсеры (Sax, Stax, Saxon, Xerces, LibXML, MSXml) могли по разному интерпретировать поток тегов. Кто-то брал
во внимание форматирование и кто-то нет.

Вобщем при прочих равных условиях лучше ничего не трогать и оставить как есть. Тоесть просто смена кодировки
- ну возьмите Reader/Writer с кодировками и сделайте.

Как только вы захотите более технологичный вариант - поднимутся "технологичные" вопросы.
...
Рейтинг: 0 / 0
08.06.2020, 14:04
    #39967082
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
selis76,
Добро пожаловать в публичный форум.
...
Рейтинг: 0 / 0
08.06.2020, 14:06
    #39967083
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
selis76,
Если мне идти в "разработка ИС" тогда вам в ветку сиквела. Вдруг вы дезу гоните. А мы запомним))
...
Рейтинг: 0 / 0
08.06.2020, 15:22
    #39967106
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
selis76
mad_nazgul


Не делайте буфер на MS SQL.

Ну если делаете, то храните XML в BLOB-ах. :-)


А зачем в SQL XML колонки как специальный тип? Подумали? .....
а ну конечно чтобы XMLQuery использовать XPath и вообще много чего интересного. Нельзя узко мыслить в современном мире, иначе XML будет восприниматься как обычный текст с тегами, без валидации по схеме и без применения стека XML технологий.


Э-э-э я о том, что не надо решать задачу, не удобными инструментами.
Если нужен буфер/кэш, то для этого есть другие инструменты, которые заточены под эту работу.
Запихивать все в БД, это так себе идея.

Когда мне говорят, что собираются хранить в БД JSON или XML у меня первый вопрос "Зачем?", второй "Можно ли этого не делать?", третий "Можно ли хранить данные в РМД?" и т.д.

Т.к. хранение в "гибких форматах" в БД это просто оправдание "кривой архитектуры".

Либо у вас приложение не зависит от системы хранения данных.
Так что можно достаточно безболезненно можно поменять одно хранилище на другое.
Либо у вас появлется жуткокостыльный монстр, которой потом будут разгребать за вами.
Хорошо если быстро похоронят.
...
Рейтинг: 0 / 0
08.06.2020, 20:01
    #39967173
selis76
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
Dmitry.
наличие xml заголовка типа <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
в java строке - абсурдно

т.к. для получения строки уже была использована кодировка

Код: java
1.
String messagetext = new String(body, "UTF-8");



т.е. если в body есть заголовок encoding="windows-1251" а ты применил "UTF-8", то ты поломал кодировку сообщения.

попробуй использовать TrueXML.setBinaryStream().write(body) вместо TrueXML.setString(messagetext)


Код: java
1.
TrueXML.setBinaryStream().write(body) 

работает.
Хотя непонятно тогда почему на том же сообщении в UTF-8 НЕ работает
Код: java
1.
TrueXML.setString(messagetext)



Судя по стандарту https://www.w3.org/TR/xml/#sec-guessing должно было работать, но видимо SQLXML от setString ждет чтото другого.

Проверю еще на разных кодировках, спасибо за наводку
...
Рейтинг: 0 / 0
08.06.2020, 20:19
    #39967180
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
mad_nazgul
selis76
пропущено...


А зачем в SQL XML колонки как специальный тип? Подумали? .....
а ну конечно чтобы XMLQuery использовать XPath и вообще много чего интересного. Нельзя узко мыслить в современном мире, иначе XML будет восприниматься как обычный текст с тегами, без валидации по схеме и без применения стека XML технологий.


Э-э-э я о том, что не надо решать задачу, не удобными инструментами.
Если нужен буфер/кэш, то для этого есть другие инструменты, которые заточены под эту работу.
Запихивать все в БД, это так себе идея.

Когда мне говорят, что собираются хранить в БД JSON или XML у меня первый вопрос "Зачем?", второй "Можно ли этого не делать?", третий "Можно ли хранить данные в РМД?" и т.д.

Т.к. хранение в "гибких форматах" в БД это просто оправдание "кривой архитектуры".

Я думаю что можно если на уровне бизнеса мы договариваемся что JSON-документ - атомарен
с точки зрения БЛ и мы никогда никогда не будем модифицировать его поля в транзакциях
и в кросс-зависимостях от других документов и не делать петель и дедлоков.

Кстати посмотрите вот этот господин рассказывает что разрабатывал платёжные системы
и он рекомендует JSON(B) в PG.

YouTube Video
...
Рейтинг: 0 / 0
09.06.2020, 07:11
    #39967239
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
mayton

Я думаю что можно если на уровне бизнеса мы договариваемся что JSON-документ - атомарен
с точки зрения БЛ и мы никогда никогда не будем модифицировать его поля в транзакциях
и в кросс-зависимостях от других документов и не делать петель и дедлоков.


Договариваться можно о чем угодно.
Этот договор ничего не стоит, потому что бизнес придет через неделю после того, как договорились и скажет, что им срочно надо постоянно менять JSON.
Ну это как бы нормальное поведение.

А потом выясниться, что по этим JSON-ам нужно аналитику делать, да еще "по времени".

Хорошо, если не вляпаться во что-то вроде бюджетирования.
Когда нужно один и тот же документ иметь сразу в нескольких вариантах, плюс возможность работы одновременно нескольких человек с логгированием изменений каждого (читай система контроля версий)

Сам участвовал в проекте, где "архитекторы" решили все данные хранить в JSON (MS SQL)
Для ввода данных было еще норм, но пользователи постоянно жаловались на тормоза.

А вот когда приступили к отчетам, то базисты "вешались".
Запросы по несколько часов. БД вставала колом.
В конце концов решили делать отдельную БД для построения отчетов. Нормализованную без JSON.
И вся идея "гибкости ввода" пошла по бороде.
Т.к. нужно было постоянно отслеживать изменения в JSON. Менять скрипты загрузки и менять структуру БД для отчетов.

ИМХО там БД нужна была, как телеге пятая нога.
Т.е. данные прогонялись по Event Sourcing, в архитектуре CQRS.
А для отчетов нужно было брать что-то вроде Hadoop.

Тогда может быть было бы полегче.

А так. Взяли худшее из двух "миров" и огребли проблемы по полной.

mayton

Кстати посмотрите вот этот господин рассказывает что разрабатывал платёжные системы
и он рекомендует JSON(B) в PG.

Ну и посмотрите последние доклады Бартунова по поводу перформанса JSON.


Смотрел. Сам же Бартунов, говорит, что хранить данные в JSON - плохая идея.
БД можно положить "на раз, два".
И сам расказывал про кейсы, когда их приглашали проконсультировать, как выбраться из JSON-жопы.

Да. Возможность есть. Да работает достаточно быстро. Но стоить систему на данной фиче не надо.
...
Рейтинг: 0 / 0
09.06.2020, 08:17
    #39967253
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать XML utf-8 в utf-16 вместе с заголовком
mad_nazgul
А так. Взяли худшее из двух "миров" и огребли проблемы по полной.

Ну так понятно, что надо было сразу брать монгу и всё бы работало нормально.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Преобразовать XML utf-8 в utf-16 вместе с заголовком / 25 сообщений из 64, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]