'Unconvertable character' 发送包含特殊字符的 HTTPRequestHeader 时 HTTPRequest 节点出现异常
'Unconvertable character' exception in HTTPRequest node when sending a HTTPRequestHeader containing a special character
我在向包含特殊字符的 HTTPRequest 节点发送 HTTPRequestHeader 时遇到 'Unconvertable character' 异常。
调试时 ExceptionList 中的错误:
RecoverableException
File:CHARACTER:/jenkins/slot0/product-build/WMB/src/CommonServices/ImbConverter.cpp
Line:INTEGER:733
Function:CHARACTER:ImbConverterCPP::
Type:CHARACTER:
Name:CHARACTER:
Label:CHARACTER:
Catalog:CHARACTER:BIPmsgs
Severity:INTEGER:3
Number:INTEGER:2136
Text:CHARACTER:Unconvertable character
Insert
Type:INTEGER:5
Text:CHARACTER:1920
Insert
Type:INTEGER:5
Text:CHARACTER:4c0061006c0069006100192073002000420075007200690061006c002000460075006e006400200061006e006400200043006100720065002000450078007000 ...data truncated to first 64 chars
Insert
Type:INTEGER:2
Text:CHARACTER:819
我的 esql 代码片段:
SET OutputRoot.HTTPRequestHeader."Content-Type" = 'application/octet-stream';
SET OutputRoot.HTTPRequestHeader."X-IntegrationServer-Resource-Name" = rInputDocData.*:DocumentName;
--Setting the content
SET OutputRoot.BLOB.BLOB = BASE64DECODE(rInputDocAttachment.*:AttachmentData64Binary);
特殊字符出现在字段 rInputDocData.*:DocumentName 中。其中一些值是:
Printing….PDF
Mark’s Agreement .pdf
注意上面两个值中的 … 和 ’ 不被识别为 UTF-8 的一部分。
有没有办法在 ESQL 中将这些值转换为 ISO 8859-1,因为在 Notepad++ 中执行相同的转换会导致这些值被接受?
我已经尝试了以下步骤,但 none 成功了,但我仍然遇到同样的错误:
将 OutputRoot.Properties.CodedCharSetId 设置为 1208,将 OutputRoot.Properties.Encoding 设置为 546,就像在输入中收到请求时的属性一样。
设置 OutputRoot.Properties.CodedCharSetId 为 819。
将内容类型 HTTPRequestHeader 设置为 'application/octet-stream; charset=utf-8'。
将内容类型 HTTPRequestHeader 设置为 'application/octet-stream; charset=iso-8859-1'。
通过以下方式转换 HTTPRequestHeader 'X-IntegrationServer-Resource-Name':
- SET OutputRoot.HTTPRequestHeader."X-IntegrationServer-Resource-Name" = CAST(rInputDocData.*:DocumentName AS CHARACTER CCSID 1208 ENCODING 546);
- SET OutputRoot.HTTPRequestHeader."X-IntegrationServer-Resource-Name" = CAST(rInputDocData.*:DocumentName AS CHARACTER CCSID 819);
- SET OutputRoot.HTTPRequestHeader."X-IntegrationServer-Resource-Name" = CAST(CAST(rInputDocData.*:DocumentName AS CHARACTER CCSID 1208 ENCODING 546) AS CHARACTER CCSID 819);
源供应商拒绝 handle/convert 特殊字符,因此我们需要在 ACE 中处理此问题。任何帮助将不胜感激。
HTTP headers 应该只使用 US-ASCII 范围内的字符。其他一些字符 可能 是可以容忍的,但是网络服务器实现在这方面并不一致。
有关详细信息,请参阅此处的讨论:what characters are allowed in HTTP header values?
该对话的参与者之一是 HTTP/1.1 规范的作者,因此我认为我们可以依赖他的意见。
回复:
Notice the … and ’ in the above two values which are not recognized as part of UTF-8.
UTF-8 可以表示任何 Unicode 字符,因此该声明不可能是真的。仔细看报错,引用的CCSID是819,也就是IBM CCSID for ISO-8859-1。
似乎 ... 字符不在 CCSID 819 字符集中。它在 Latin 1 的 Windows 版本中,CCSID 1252,但正如前面的回答所说,它可能不适用于目标 Web 服务器。
您可以尝试这些,但不确定是否有效:
SET OutputRoot.HTTPRequestHeader."X-IntegrationServer-Resource-Name" = CAST(ASBITSTREAM(rInputDocData.*:DocumentName CCSID InputRoot.Properties.CodedCharSetId) AS CHARACTER CCSID 819);
SET OutputRoot.HTTPRequestHeader."X-IntegrationServer-Resource-Name" = CAST(ASBITSTREAM(rInputDocData.*:DocumentName CCSID InputRoot.Properties.CodedCharSetId) AS CHARACTER CCSID 1252);
以下对我有用,但正如最上面的评论所指出的那样,它确实因目标服务器中的编码错误而继续失败:
SET OutputRoot.HTTPRequestHeader."X-IntegrationServer-Resource-Name" = CAST(CAST(rInputDocData.*:DocumentName AS BLOB CCSID InputRoot.Properties.CodedCharSetId) AS CHARACTER CCSID 819);
我在向包含特殊字符的 HTTPRequest 节点发送 HTTPRequestHeader 时遇到 'Unconvertable character' 异常。
调试时 ExceptionList 中的错误:
RecoverableException
File:CHARACTER:/jenkins/slot0/product-build/WMB/src/CommonServices/ImbConverter.cpp
Line:INTEGER:733
Function:CHARACTER:ImbConverterCPP::
Type:CHARACTER:
Name:CHARACTER:
Label:CHARACTER:
Catalog:CHARACTER:BIPmsgs
Severity:INTEGER:3
Number:INTEGER:2136
Text:CHARACTER:Unconvertable character
Insert
Type:INTEGER:5
Text:CHARACTER:1920
Insert
Type:INTEGER:5
Text:CHARACTER:4c0061006c0069006100192073002000420075007200690061006c002000460075006e006400200061006e006400200043006100720065002000450078007000 ...data truncated to first 64 chars
Insert
Type:INTEGER:2
Text:CHARACTER:819
我的 esql 代码片段:
SET OutputRoot.HTTPRequestHeader."Content-Type" = 'application/octet-stream';
SET OutputRoot.HTTPRequestHeader."X-IntegrationServer-Resource-Name" = rInputDocData.*:DocumentName;
--Setting the content
SET OutputRoot.BLOB.BLOB = BASE64DECODE(rInputDocAttachment.*:AttachmentData64Binary);
特殊字符出现在字段 rInputDocData.*:DocumentName 中。其中一些值是:
Printing….PDF
Mark’s Agreement .pdf
注意上面两个值中的 … 和 ’ 不被识别为 UTF-8 的一部分。
有没有办法在 ESQL 中将这些值转换为 ISO 8859-1,因为在 Notepad++ 中执行相同的转换会导致这些值被接受?
我已经尝试了以下步骤,但 none 成功了,但我仍然遇到同样的错误:
将 OutputRoot.Properties.CodedCharSetId 设置为 1208,将 OutputRoot.Properties.Encoding 设置为 546,就像在输入中收到请求时的属性一样。
设置 OutputRoot.Properties.CodedCharSetId 为 819。
将内容类型 HTTPRequestHeader 设置为 'application/octet-stream; charset=utf-8'。
将内容类型 HTTPRequestHeader 设置为 'application/octet-stream; charset=iso-8859-1'。
通过以下方式转换 HTTPRequestHeader 'X-IntegrationServer-Resource-Name':
- SET OutputRoot.HTTPRequestHeader."X-IntegrationServer-Resource-Name" = CAST(rInputDocData.*:DocumentName AS CHARACTER CCSID 1208 ENCODING 546);
- SET OutputRoot.HTTPRequestHeader."X-IntegrationServer-Resource-Name" = CAST(rInputDocData.*:DocumentName AS CHARACTER CCSID 819);
- SET OutputRoot.HTTPRequestHeader."X-IntegrationServer-Resource-Name" = CAST(CAST(rInputDocData.*:DocumentName AS CHARACTER CCSID 1208 ENCODING 546) AS CHARACTER CCSID 819);
源供应商拒绝 handle/convert 特殊字符,因此我们需要在 ACE 中处理此问题。任何帮助将不胜感激。
HTTP headers 应该只使用 US-ASCII 范围内的字符。其他一些字符 可能 是可以容忍的,但是网络服务器实现在这方面并不一致。
有关详细信息,请参阅此处的讨论:what characters are allowed in HTTP header values? 该对话的参与者之一是 HTTP/1.1 规范的作者,因此我认为我们可以依赖他的意见。
回复:
Notice the … and ’ in the above two values which are not recognized as part of UTF-8.
UTF-8 可以表示任何 Unicode 字符,因此该声明不可能是真的。仔细看报错,引用的CCSID是819,也就是IBM CCSID for ISO-8859-1。
似乎 ... 字符不在 CCSID 819 字符集中。它在 Latin 1 的 Windows 版本中,CCSID 1252,但正如前面的回答所说,它可能不适用于目标 Web 服务器。
您可以尝试这些,但不确定是否有效:
SET OutputRoot.HTTPRequestHeader."X-IntegrationServer-Resource-Name" = CAST(ASBITSTREAM(rInputDocData.*:DocumentName CCSID InputRoot.Properties.CodedCharSetId) AS CHARACTER CCSID 819);
SET OutputRoot.HTTPRequestHeader."X-IntegrationServer-Resource-Name" = CAST(ASBITSTREAM(rInputDocData.*:DocumentName CCSID InputRoot.Properties.CodedCharSetId) AS CHARACTER CCSID 1252);
以下对我有用,但正如最上面的评论所指出的那样,它确实因目标服务器中的编码错误而继续失败:
SET OutputRoot.HTTPRequestHeader."X-IntegrationServer-Resource-Name" = CAST(CAST(rInputDocData.*:DocumentName AS BLOB CCSID InputRoot.Properties.CodedCharSetId) AS CHARACTER CCSID 819);