|
Преобразовать XML utf-8 в utf-16 вместе с заголовком
|
|||
---|---|---|---|
#18+
Есть сообщение 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.
Выдаст "XML parsing: line 1, character 38, unable to switch the encoding" Самое удивительное если сообщение передать в UTF-8 но заголовок поправить на encoding="UTF-16" передача в SQl пройдет нормально. Возможно из за того что Java хранит строки внутри в Utf-16 по некоторым источникам. В общем хотелось бы услышать Best practice , не хочется писать костыли ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 18:36 |
|
Преобразовать XML utf-8 в utf-16 вместе с заголовком
|
|||
---|---|---|---|
#18+
selis76, Делай как проще. Сама задача есть костыль. А ты думаешь как костыль сделать технологичнее))) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 18:45 |
|
Преобразовать XML utf-8 в utf-16 вместе с заголовком
|
|||
---|---|---|---|
#18+
PetroNotC Sharp selis76, Делай как проще. Сама задача есть костыль. А ты думаешь как костыль сделать технологичнее))) Ну это странно, что сама задача костыль вроде перекодировка в более широкую кодировку не является криминалом. Мне потом для Win-1251 тоже отдельный костыль писать? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 18:57 |
|
Преобразовать XML utf-8 в utf-16 вместе с заголовком
|
|||
---|---|---|---|
#18+
selis76, Костыль или нет задача мы поймем если ты напишешь откуда появляется кодировка НЕ ТА ЧТО ТРЕБУЕТСЯ. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 19:06 |
|
Преобразовать XML utf-8 в utf-16 вместе с заголовком
|
|||
---|---|---|---|
#18+
selis76, Сиквел хранит только в utf 16, а приходят извне нас utf 8. Так? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 19:11 |
|
Преобразовать XML utf-8 в utf-16 вместе с заголовком
|
|||
---|---|---|---|
#18+
PetroNotC Sharp selis76, Сиквел хранит только в utf 16, а приходят извне нас utf 8. Так? да Сообщения приходят из шины RabbitMQ, кодировка сообщения известна. Я их сохраняю в свой буфер, буфер на MSSQL он XML хранит в UTF16. При маштабировании могут появляться новые кодировки ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 19:19 |
|
Преобразовать XML utf-8 в utf-16 вместе с заголовком
|
|||
---|---|---|---|
#18+
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.
Выдаст "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. Нужно прочитать строку в карту, поменять кодировку и сохранить в строку. Хорошего вам вечера! ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 19:24 |
|
Преобразовать XML utf-8 в utf-16 вместе с заголовком
|
|||
---|---|---|---|
#18+
selis76, И что? Не шина их перекодирует, а все 500 адаптеров пишут у себя код перекодировки? Как то странно имхо. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 19:58 |
|
Преобразовать XML utf-8 в utf-16 вместе с заголовком
|
|||
---|---|---|---|
#18+
selis76, Дай ссыль что сиквел не умеет хранить другие кодировки. Я нашел https://docs.microsoft.com/ru-ru/sql/relational-databases/native-client/features/using-xml-data-types?view=sql-server-ver15 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 20:17 |
|
Преобразовать XML utf-8 в utf-16 вместе с заголовком
|
|||
---|---|---|---|
#18+
наличие xml заголовка типа <?xml version="1.0" encoding="UTF-8" standalone="yes"?> в java строке - абсурдно т.к. для получения строки уже была использована кодировка Код: java 1.
т.е. если в body есть заголовок encoding="windows-1251" а ты применил "UTF-8", то ты поломал кодировку сообщения. попробуй использовать TrueXML.setBinaryStream().write(body) вместо TrueXML.setString(messagetext) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 22:15 |
|
Преобразовать XML utf-8 в utf-16 вместе с заголовком
|
|||
---|---|---|---|
#18+
selis76 PetroNotC Sharp selis76, Сиквел хранит только в utf 16, а приходят извне нас utf 8. Так? да Сообщения приходят из шины RabbitMQ, кодировка сообщения известна. Я их сохраняю в свой буфер, буфер на MSSQL он XML хранит в UTF16. При маштабировании могут появляться новые кодировки Не делайте буфер на MS SQL. Ну если делаете, то храните XML в BLOB-ах. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2020, 07:26 |
|
Преобразовать XML utf-8 в utf-16 вместе с заголовком
|
|||
---|---|---|---|
#18+
mad_nazgul, +1 Аффтар, 1. Вы не читаете что вам пишут. Сиквел хранит любую кодировку. 2. Не используйте сиквел. Итого проблема высосана из пальца. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2020, 08:03 |
|
Преобразовать XML utf-8 в utf-16 вместе с заголовком
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2020, 13:44 |
|
Преобразовать XML utf-8 в utf-16 вместе с заголовком
|
|||
---|---|---|---|
#18+
mad_nazgul Не делайте буфер на MS SQL. Ну если делаете, то храните XML в BLOB-ах. :-) А зачем в SQL XML колонки как специальный тип? Подумали? ..... а ну конечно чтобы XMLQuery использовать XPath и вообще много чего интересного. Нельзя узко мыслить в современном мире, иначе XML будет восприниматься как обычный текст с тегами, без валидации по схеме и без применения стека XML технологий. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2020, 13:49 |
|
Преобразовать XML utf-8 в utf-16 вместе с заголовком
|
|||
---|---|---|---|
#18+
selis76 mad_nazgul Не делайте буфер на MS SQL. Ну если делаете, то храните XML в BLOB-ах. :-) А зачем в SQL XML колонки как специальный тип? Подумали? ..... а ну конечно чтобы XMLQuery использовать XPath и вообще много чего интересного. Нельзя узко мыслить в современном мире, иначе XML будет восприниматься как обычный текст с тегами, без валидации по схеме и без применения стека XML технологий. Вы правы наполовину. Если используете запросы к XML, то дайте пример. Если нет, то оверхед по архитектуре. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2020, 13:53 |
|
Преобразовать XML utf-8 в utf-16 вместе с заголовком
|
|||
---|---|---|---|
#18+
selis76, Если для вас проблема с сиквелом очевидна, значит вам не трудно дать ссыль на нее с нашего форума по сиквелу? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2020, 13:58 |
|
Преобразовать XML utf-8 в utf-16 вместе с заголовком
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Вы правы наполовину. Если используете запросы к XML, то дайте пример. Если нет, то оверхед по архитектуре. Perto прошу не участвовать в обсуждении, я не собираюсь рассказывать всю свою архитектуру для этого есть другой раздел форума https://www.sql.ru/forum/systems-architecture . Как говорится не знаете ответа пройдите мимо ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2020, 14:00 |
|
Преобразовать XML utf-8 в utf-16 вместе с заголовком
|
|||
---|---|---|---|
#18+
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 с кодировками и сделайте. Как только вы захотите более технологичный вариант - поднимутся "технологичные" вопросы. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2020, 14:01 |
|
Преобразовать XML utf-8 в utf-16 вместе с заголовком
|
|||
---|---|---|---|
#18+
selis76, Добро пожаловать в публичный форум. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2020, 14:04 |
|
Преобразовать XML utf-8 в utf-16 вместе с заголовком
|
|||
---|---|---|---|
#18+
selis76, Если мне идти в "разработка ИС" тогда вам в ветку сиквела. Вдруг вы дезу гоните. А мы запомним)) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2020, 14:06 |
|
Преобразовать XML utf-8 в utf-16 вместе с заголовком
|
|||
---|---|---|---|
#18+
selis76 mad_nazgul Не делайте буфер на MS SQL. Ну если делаете, то храните XML в BLOB-ах. :-) А зачем в SQL XML колонки как специальный тип? Подумали? ..... а ну конечно чтобы XMLQuery использовать XPath и вообще много чего интересного. Нельзя узко мыслить в современном мире, иначе XML будет восприниматься как обычный текст с тегами, без валидации по схеме и без применения стека XML технологий. Э-э-э я о том, что не надо решать задачу, не удобными инструментами. Если нужен буфер/кэш, то для этого есть другие инструменты, которые заточены под эту работу. Запихивать все в БД, это так себе идея. Когда мне говорят, что собираются хранить в БД JSON или XML у меня первый вопрос "Зачем?", второй "Можно ли этого не делать?", третий "Можно ли хранить данные в РМД?" и т.д. Т.к. хранение в "гибких форматах" в БД это просто оправдание "кривой архитектуры". Либо у вас приложение не зависит от системы хранения данных. Так что можно достаточно безболезненно можно поменять одно хранилище на другое. Либо у вас появлется жуткокостыльный монстр, которой потом будут разгребать за вами. Хорошо если быстро похоронят. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2020, 15:22 |
|
Преобразовать XML utf-8 в utf-16 вместе с заголовком
|
|||
---|---|---|---|
#18+
Dmitry. наличие xml заголовка типа <?xml version="1.0" encoding="UTF-8" standalone="yes"?> в java строке - абсурдно т.к. для получения строки уже была использована кодировка Код: java 1.
т.е. если в body есть заголовок encoding="windows-1251" а ты применил "UTF-8", то ты поломал кодировку сообщения. попробуй использовать TrueXML.setBinaryStream().write(body) вместо TrueXML.setString(messagetext) Код: java 1.
работает. Хотя непонятно тогда почему на том же сообщении в UTF-8 НЕ работает Код: java 1.
Судя по стандарту https://www.w3.org/TR/xml/#sec-guessing должно было работать, но видимо SQLXML от setString ждет чтото другого. Проверю еще на разных кодировках, спасибо за наводку ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2020, 20:01 |
|
Преобразовать XML utf-8 в utf-16 вместе с заголовком
|
|||
---|---|---|---|
#18+
mad_nazgul selis76 пропущено... А зачем в SQL XML колонки как специальный тип? Подумали? ..... а ну конечно чтобы XMLQuery использовать XPath и вообще много чего интересного. Нельзя узко мыслить в современном мире, иначе XML будет восприниматься как обычный текст с тегами, без валидации по схеме и без применения стека XML технологий. Э-э-э я о том, что не надо решать задачу, не удобными инструментами. Если нужен буфер/кэш, то для этого есть другие инструменты, которые заточены под эту работу. Запихивать все в БД, это так себе идея. Когда мне говорят, что собираются хранить в БД JSON или XML у меня первый вопрос "Зачем?", второй "Можно ли этого не делать?", третий "Можно ли хранить данные в РМД?" и т.д. Т.к. хранение в "гибких форматах" в БД это просто оправдание "кривой архитектуры". Я думаю что можно если на уровне бизнеса мы договариваемся что JSON-документ - атомарен с точки зрения БЛ и мы никогда никогда не будем модифицировать его поля в транзакциях и в кросс-зависимостях от других документов и не делать петель и дедлоков. Кстати посмотрите вот этот господин рассказывает что разрабатывал платёжные системы и он рекомендует JSON(B) в PG. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2020, 20:19 |
|
Преобразовать XML utf-8 в utf-16 вместе с заголовком
|
|||
---|---|---|---|
#18+
mayton Я думаю что можно если на уровне бизнеса мы договариваемся что JSON-документ - атомарен с точки зрения БЛ и мы никогда никогда не будем модифицировать его поля в транзакциях и в кросс-зависимостях от других документов и не делать петель и дедлоков. Договариваться можно о чем угодно. Этот договор ничего не стоит, потому что бизнес придет через неделю после того, как договорились и скажет, что им срочно надо постоянно менять JSON. Ну это как бы нормальное поведение. А потом выясниться, что по этим JSON-ам нужно аналитику делать, да еще "по времени". Хорошо, если не вляпаться во что-то вроде бюджетирования. Когда нужно один и тот же документ иметь сразу в нескольких вариантах, плюс возможность работы одновременно нескольких человек с логгированием изменений каждого (читай система контроля версий) Сам участвовал в проекте, где "архитекторы" решили все данные хранить в JSON (MS SQL) Для ввода данных было еще норм, но пользователи постоянно жаловались на тормоза. А вот когда приступили к отчетам, то базисты "вешались". Запросы по несколько часов. БД вставала колом. В конце концов решили делать отдельную БД для построения отчетов. Нормализованную без JSON. И вся идея "гибкости ввода" пошла по бороде. Т.к. нужно было постоянно отслеживать изменения в JSON. Менять скрипты загрузки и менять структуру БД для отчетов. ИМХО там БД нужна была, как телеге пятая нога. Т.е. данные прогонялись по Event Sourcing, в архитектуре CQRS. А для отчетов нужно было брать что-то вроде Hadoop. Тогда может быть было бы полегче. А так. Взяли худшее из двух "миров" и огребли проблемы по полной. mayton Кстати посмотрите вот этот господин рассказывает что разрабатывал платёжные системы и он рекомендует JSON(B) в PG. Ну и посмотрите последние доклады Бартунова по поводу перформанса JSON. Смотрел. Сам же Бартунов, говорит, что хранить данные в JSON - плохая идея. БД можно положить "на раз, два". И сам расказывал про кейсы, когда их приглашали проконсультировать, как выбраться из JSON-жопы. Да. Возможность есть. Да работает достаточно быстро. Но стоить систему на данной фиче не надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2020, 07:11 |
|
|
start [/forum/topic.php?fid=59&msg=39966628&tid=2120786]: |
0ms |
get settings: |
17ms |
get forum list: |
6ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
54ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
472ms |
get tp. blocked users: |
0ms |
others: | 292ms |
total: | 847ms |
0 / 0 |