向 OTRS 发送带有变音符号的 Soap-Request

Sending Soap-Request with Umlaut to OTRS

因此,我正在尝试在 CentOS Linux 服务器上向 OTRS 发出 SOAP 请求。 有人为此在 Oracle 数据库中制作了一个 PL-SQL-Package,它工作正常,除非数据中有变音符号 (Ü)。

这是我在 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-Package 之前,我们在同一台服务器上使用了 Perl 脚本,OTRS 服务是 运行 使用 SOAP::Lite。 激活此 Perl 脚本中的跟踪,我意识到,它只是将我提供的 XML 文件中的变音符号“Ü”更改为 SOAP 请求中的“Ã�”,这显然也不正确。

Oracle 数据库上的

NLS_CHARACTERSETAL32UTF8。服务器上 otrs-用户的 NLS_LANGerman_Austria.utf8

有什么建议吗?

我找到了一个不太令人满意的解决方案。

在PL/SQL-procedure中,我使用

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

这意味着,我将其转换为 ISO 8859-1。但这并没有回答我的问题,为什么它需要这个字符集。我们通常使用UTF-8.

检查所有字符集设置,预先和 post- 更改。

OP 中的错误消息表明问题出在 perl xml 解析器中(我不是 perl 专家),但我想我会对 Oracle 的字符集转换行为发表评论。显然数据库有一个定义的字符集,但是 oracle 客户端 s/w 也定义了它认为它正在使用的字符集。连接到数据库后,字符集会根据 Oracle 的 NLS 转换自动转换。因此根据客户端的字符集进行转换。

我假设 German_Austria.utf8AL32UTF8 的转换是正确的。在数据到达这一点之前向上游查找其他可能发生的转化。

顺便说一句 - 如果客户端和数据库设置为 same 字符集,则不会发生字符转换。如果客户端字符集真的错误,那么数据库中的数据可能不正确(因为没有转换)。然后更正客户端字符集(或在具有不同字符集定义的不同客户端上)时,提取的数据将看起来 'wrong' -- 以前未转换的数据现在正在转换。