解析器未正确编码字符串

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 Markprze 编码为

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 是单字节字符集,C5C4 代码点不匹配两个想要的字符,因此我们可以消除它。