Отправка Soap-Request с умлаутом в OTRS

Итак, я пытаюсь сделать SOAP-запрос к OTRS на сервере CentOS Linux. Кто-то сделал для этого PL-SQL-пакет в базе данных Oracle, и он отлично работает, если в данных нет умлаута (Ü).

Это ошибка, которую я получаю в журнале ошибок Linux:

Feb 17 08:32:26 eotrs2 GenericInterfaceProvider-10[11317]: [Error][Kernel::GenericInterface::Debugger::DebugLog][Line:218]: DebugLog error:  Summary: Error deserializing message:not well-formed (invalid token) at line 1, column 528, byte 528 at /usr/lib64/perl5/vendor_perl/XML/Parser.pm line 187.  Data   : No data provided.
Feb 17 08:32:26 eotrs2 GenericInterfaceProvider-10[11317]: [Error][Kernel::GenericInterface::Debugger::DebugLog][Line:218]: DebugLog error:  Summary: Request could not be processed  Data   : Error deserializing message:not well-formed (invalid token) at line 1, column 528, byte 528 at /usr/lib64/perl5/vendor_perl/XML/Parser.pm line 187..
Feb 17 08:32:26 eotrs2 GenericInterfaceProvider-10[11317]: [Error][Kernel::GenericInterface::Debugger::DebugLog][Line:218]: DebugLog error:  Summary: Returning provider data to remote system (HTTP Code: 500)  Data   : Error deserializing message:not well-formed (invalid token) at line 1, column 528, byte 528 at /usr/lib64/perl5/vendor_perl/XML/Parser.pm line 187..

До того, как у нас появился пакет PL/SQL, мы использовали сценарий Perl на том же сервере, где служба OTRS работала с использованием SOAP::Lite. Активировав трассировку в этом Perl-скрипте, я понял, что он просто меняет умляут "Ü" в XML-файле, который я предоставляю, на "Ã�" в SOAP-запросе, что, очевидно, тоже неверно.

NLS_CHARACTERSET в базе данных Oracle AL32UTF8. NLS_LAN из otrs пользователей на сервере German_Austria.utf8

Какие-либо предложения?


person a.j. tawleed    schedule 17.02.2016    source источник
comment
от @a.j. tawleed: В Linux нет German_Austria.AL32UTF8. Это просто странная кодировка, специфичная для Oracle, но она достаточно похожа на обычную UTF8, так что обычно проблем не возникает.   -  person J. Chomel    schedule 09.03.2016


Ответы (2)


Я нашел не очень удовлетворительное решение.

В процедуре PL/SQL я использую

l_envelope := CONVERT(l_envelope, 'AL32UTF8', 'WE8ISO8859P1');

что означает, что я конвертирую его в ISO 8859-1. Но это не отвечает на мой вопрос, зачем ему эта кодировка. Обычно мы используем UTF-8.

person a.j. tawleed    schedule 10.03.2016

Проверьте все настройки набора символов, до и после изменений.

Сообщение об ошибке в OP предполагает, что проблема связана с парсером perl xml (и я не специалист по Perl), но я подумал, что прокомментирую поведение преобразования набора символов Oracle. Очевидно, что база данных имеет определенный набор символов, но программное обеспечение клиента оракула также определяет, какой набор символов, по его мнению, он использует. При подключении к базе данных наборы символов автоматически преобразуются в соответствии с преобразованиями Oracle NLS. Таким образом, преобразование происходит в зависимости от набора символов клиента.

Я бы предположил, что преобразование German_Austria.utf8 в AL32UTF8 происходит правильно. Посмотрите вверх по течению для других возможных преобразований, происходящих до того, как данные достигнут этой точки.

Кстати, если для клиента и базы данных задан один и тот же набор символов, преобразование символов не происходит. Если кодировка клиента была действительно неправильной, то данные в базе данных могут быть неправильными (потому что не было конвертации). Когда набор символов клиента будет затем исправлен (или на другом клиенте с другим определением набора символов), извлеченные данные будут выглядеть «неправильными» — ранее не преобразованные данные теперь преобразуются.

person Beege    schedule 11.03.2016