解析器未正确编码字符串
Parser is not encoding string correctly
我要获取的文本:
przełącznica
这是我实际拥有的(浏览器现在可以正确查看它 - 有两个方块而不是“łą”):
przecznica
BLOB:
70 72 7A 65 C5 82 C4 85 63 7A 6E 69 63 61
编辑: 这是我从解析器得到的
70 72 7A 65 1A 1A 63 7A 6E 69 63 61
用于解析 BLOB 的 ESQL:
DECLARE blobMsg BLOB InputRoot.BLOB.BLOB ;
CREATE LASTCHILD OF OutputLocalEnvironment.Variables.inpMsg DOMAIN ('XMLNSC') NAME 'XMLNSC';
CREATE LASTCHILD OF OutputLocalEnvironment.Variables.inpMsg.XMLNSC PARSE(blobMsg OPTIONS FolderBitStream CCSID 1208 FORMAT 'XMLNSC');
我试过 CCSID:1208 (UTF8)、912 (ISO-8859-2)、1200(我猜是 UTF16):
https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/nls/rbagsccsidcdepgscharsets.htm
编辑:工作代码:
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 因此当您尝试使用您概述的代码。您需要改为执行 CAST。
我在 IIB 10 中生成了一个小测试 Application/MsgFlow 来说明 CASTing 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 is a variable width character encoding that sets the high order bit to indicate two or more bytes. We also want a page that shows the common code points for UTF-8 Complete Character List for UTF-8。请注意,它实际上并不完整。
查看前 4 个字节 none 的高位
70 72 7A 65
前面提到的字符列表说那是 prze,到目前为止还不错。
然后我们点击高位打开的C8。做一些视觉解析,我们得到两组 可能 双字节字符对
C5 82
C4 85
参考字符列表,我们的两个候选对确实匹配了我们想要的两个字符,接下来的六个字符没有高位转换为 cznica .真好看
现在消除其他候选编码,如果可以的话。
UTF-16 uses 2 or 4 bytes to represent each character depending on the Byte Order Mark 与 prze 编码为
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 - CP 912 是单字节字符集,C5 和 C4 代码点不匹配两个想要的字符,因此我们可以消除它。
我要获取的文本:
przełącznica
这是我实际拥有的(浏览器现在可以正确查看它 - 有两个方块而不是“łą”):
przecznica
BLOB:
70 72 7A 65 C5 82 C4 85 63 7A 6E 69 63 61
编辑: 这是我从解析器得到的
70 72 7A 65 1A 1A 63 7A 6E 69 63 61
用于解析 BLOB 的 ESQL:
DECLARE blobMsg BLOB InputRoot.BLOB.BLOB ;
CREATE LASTCHILD OF OutputLocalEnvironment.Variables.inpMsg DOMAIN ('XMLNSC') NAME 'XMLNSC';
CREATE LASTCHILD OF OutputLocalEnvironment.Variables.inpMsg.XMLNSC PARSE(blobMsg OPTIONS FolderBitStream CCSID 1208 FORMAT 'XMLNSC');
我试过 CCSID:1208 (UTF8)、912 (ISO-8859-2)、1200(我猜是 UTF16): https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/nls/rbagsccsidcdepgscharsets.htm
编辑:工作代码:
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 因此当您尝试使用您概述的代码。您需要改为执行 CAST。
我在 IIB 10 中生成了一个小测试 Application/MsgFlow 来说明 CASTing 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 is a variable width character encoding that sets the high order bit to indicate two or more bytes. We also want a page that shows the common code points for UTF-8 Complete Character List for UTF-8。请注意,它实际上并不完整。
查看前 4 个字节 none 的高位
70 72 7A 65
前面提到的字符列表说那是 prze,到目前为止还不错。
然后我们点击高位打开的C8。做一些视觉解析,我们得到两组 可能 双字节字符对
C5 82
C4 85
参考字符列表,我们的两个候选对确实匹配了我们想要的两个字符,接下来的六个字符没有高位转换为 cznica .真好看
现在消除其他候选编码,如果可以的话。
UTF-16 uses 2 or 4 bytes to represent each character depending on the Byte Order Mark 与 prze 编码为
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 - CP 912 是单字节字符集,C5 和 C4 代码点不匹配两个想要的字符,因此我们可以消除它。