Encoding 分析器未正确编码字符串

Encoding 分析器未正确编码字符串,encoding,character-encoding,ibm-integration-bus,Encoding,Character Encoding,Ibm Integration Bus,我试图获取的文本: przełącznica 这就是我实际拥有的(浏览器现在可能会正确地查看它-有两个正方形而不是“łą”): 水滴: 编辑:这是我从解析器得到的 70 72 7A 65 1A 1A 63 7A 6E 69 63 61 用于分析BLOB的ESQL: 声明blobMsg BLOB InputRoot.BLOB.BLOB; 创建OutputLocalEnvironment.Variables.InputMsg域('XMLNSC')名称“XMLNSC”的最后一个子项; 创建Ou

我试图获取的文本:

przełącznica
这就是我实际拥有的(浏览器现在可能会正确地查看它-有两个正方形而不是“łą”):


水滴:

编辑:这是我从解析器得到的

70 72 7A 65 1A 1A 63 7A 6E 69 63 61

用于分析BLOB的ESQL:

声明blobMsg BLOB InputRoot.BLOB.BLOB;
创建OutputLocalEnvironment.Variables.InputMsg域('XMLNSC')名称“XMLNSC”的最后一个子项;
创建OutputLocalEnvironment.Variables.InputMsg.XMLNSC解析的最后一个子项(blobMsg选项FolderBitStream CCSID 1208格式“XMLNSC”);
我试过CCSID:1208(UTF8)、912(ISO-8859-2)、1200(我想是UTF16):

编辑:工作代码:

DECLARE blobMsg BLOB InputRoot.BLOB.BLOB;
DECLARE remove BLOB X'EFBBBF';
DECLARE message BLOB REPLACE(InputRoot.BLOB.BLOB, remove, CAST('' AS BLOB));
CREATE LASTCHILD OF OutputLocalEnvironment.Variables.inpMsg DOMAIN ('XMLNSC') NAME 'XMLNSC';
CREATE LASTCHILD OF OutputLocalEnvironment.Variables.inpMsg.XMLNSC PARSE(message OPTIONS FolderBitStream CCSID 05348 FORMAT 'XMLNSC');

首先,przełcznica本身不是有效的XML,因此当您尝试使用所概述的代码调用XMLNSC解析器时,会出现异常。你需要做一个演员

我在IIB10中生成了一个小的测试应用程序/MsgFlow来演示如何铸造BLOB

ConvertAndParse中的代码是

CREATE COMPUTE MODULE ConvertAndParse
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
    DECLARE blobMsg BLOB X'70727A65C582C485637A6E696361';
    CREATE LASTCHILD OF OutputLocalEnvironment.Variables.inpMsg DOMAIN 'XMLNSC';
    CREATE LASTCHILD OF OutputLocalEnvironment.Variables.inpMsg.XMLNSC NAME 'AsUtf8' VALUE CAST(blobMsg AS CHAR CCSID 1208);

    CREATE LASTCHILD OF OutputRoot DOMAIN 'XMLNSC';
    CREATE LASTCHILD OF OutputRoot.XMLNSC.EncodingResponse NAME 'AsUtf8InTag' VALUE CAST(blobMsg AS CHAR CCSID 1208);
    CREATE LASTCHILD OF OutputRoot.XMLNSC.EncodingResponse NAME CAST(blobMsg AS CHAR CCSID 1208) VALUE 'As a tag name';

    RETURN TRUE;
END;
END MODULE;
运行调试会话时,放入LocalEnvironment树中的值如下所示

以及从浏览器调用流的结果

现在让我们来处理我们正在研究的编码。看看我假设的是输入BLOB,看看BLOB是否与UTF-8匹配

70 72 7A 65 C5 82 C4 85 63 7A 6E 69 63 61
是一种可变宽度字符编码,它将高位设置为指示两个或更多字节。我们还需要一个显示UTF-8通用代码点的页面。注意,它实际上并不完整

查看前4个字节,没有一个具有高阶位

70 72 7A 65 
前面提到的字符列表显示这是prze,到目前为止还不错

然后我们点击C8,它有高阶位。通过一点可视化解析,我们得到两组可能的双字节字符对

C5 82
C4 85
参考字符列表,我们的两个候选对事实上匹配了我们想要的两个字符和接下来的六个字符,它们在翻译到cznica时没有高阶位。看起来真不错

现在,如果可以的话,消除其他候选编码

使用2或4个字节表示每个字符,具体取决于编码为

UTF-16BE - CP 1200 - 00 70 00 72 00 7A 00 65
UTF-16LE - CP 1202 - 70 00 72 00 7A 00 65 00
鉴于没有大量的空字符00,因此对UTF-16进行折扣是合理的


ISO-8859-2-是一个单字节字符集,C5C4代码点与两个所需字符不匹配,因此我们可以将其删除。

首先przełcznica本身不是有效的XML,因此当您尝试使用所需代码调用XMLNSC解析器时,会出现异常已概述。你需要做一个演员

我在IIB10中生成了一个小的测试应用程序/MsgFlow来演示如何铸造BLOB

ConvertAndParse中的代码是

CREATE COMPUTE MODULE ConvertAndParse
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
    DECLARE blobMsg BLOB X'70727A65C582C485637A6E696361';
    CREATE LASTCHILD OF OutputLocalEnvironment.Variables.inpMsg DOMAIN 'XMLNSC';
    CREATE LASTCHILD OF OutputLocalEnvironment.Variables.inpMsg.XMLNSC NAME 'AsUtf8' VALUE CAST(blobMsg AS CHAR CCSID 1208);

    CREATE LASTCHILD OF OutputRoot DOMAIN 'XMLNSC';
    CREATE LASTCHILD OF OutputRoot.XMLNSC.EncodingResponse NAME 'AsUtf8InTag' VALUE CAST(blobMsg AS CHAR CCSID 1208);
    CREATE LASTCHILD OF OutputRoot.XMLNSC.EncodingResponse NAME CAST(blobMsg AS CHAR CCSID 1208) VALUE 'As a tag name';

    RETURN TRUE;
END;
END MODULE;
运行调试会话时,放入LocalEnvironment树中的值如下所示

以及从浏览器调用流的结果

现在让我们来处理我们正在研究的编码。看看我假设的是输入BLOB,看看BLOB是否与UTF-8匹配

70 72 7A 65 C5 82 C4 85 63 7A 6E 69 63 61
是一种可变宽度字符编码,它将高位设置为指示两个或更多字节。我们还需要一个显示UTF-8通用代码点的页面。注意,它实际上并不完整

查看前4个字节,没有一个具有高阶位

70 72 7A 65 
前面提到的字符列表显示这是prze,到目前为止还不错

然后我们点击C8,它有高阶位。通过一点可视化解析,我们得到两组可能的双字节字符对

C5 82
C4 85
参考字符列表,我们的两个候选对事实上匹配了我们想要的两个字符和接下来的六个字符,它们在翻译到cznica时没有高阶位。看起来真不错

现在,如果可以的话,消除其他候选编码

使用2或4个字节表示每个字符,具体取决于编码为

UTF-16BE - CP 1200 - 00 70 00 72 00 7A 00 65
UTF-16LE - CP 1202 - 70 00 72 00 7A 00 65 00
鉴于没有大量的空字符00,因此对UTF-16进行折扣是合理的


ISO-8859-2-是一个单字节字符集,C5C4代码点与所需的两个字符不匹配,因此我们可以消除它。

请将输入文档作为XML文档和字节序列提供。还请告诉我们源应用程序在创建XML文档时使用了哪个CCSID(文本编码)。如果没有正确的CCSID,则无法可靠地解释输入BLOB。@filemono您可以将输入BLOB添加为十六进制对吗。@filemono不知道字符X'EFBBBF“应该出现在输入BLOB的前面,我仍然建议使用带有AFTER的子字符串。声明消息BLOB SUBSTRING(删除后的blobMsg);请以XML文档和字节序列的形式提供输入文档。还请告诉我们哪个CCSID(文本编码)创建XML文档时使用的源应用程序。如果没有正确的CCSID,则无法可靠地解释输入BLOB。@filemono可以将输入BLOB添加为十六进制对。@filemono不认为字符X'EFBBBF“应该出现在输入BLOB的前面,我仍然建议使用带有AFTER的子字符串。声明消息BLOB子字符串(删除后的blobMsg);谢谢你详细的回答,它解释了很多!。不幸的是,使用CSSID 1208进行解析不起作用。它使用的是5348代码,即Windows1拉丁语。它应该适用于1208,特别是当我从1208中投射BLOB并剪切BOM签名时(新版本的流接收utf-8bom编码的消息)。我用正在运行的代码编辑了我的问题。@filemono欢迎您,感谢您对