Парсер неправильно кодирует строку - PullRequest
0 голосов
/ 19 марта 2020

Текст, который я пытаюсь получить:

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

E SQL используется для анализа BLOB:

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');

1 Ответ

2 голосов
/ 24 марта 2020

Во-первых, przełącznica само по себе недопустимо XML, и поэтому вы получите исключение при попытке вызвать синтаксический анализатор XMLNS C с использованием кода, который вы указали. Вместо этого вам нужно сделать CAST.

Я сгенерировал небольшой тестовый Application / MsgFlow в IIB 10, чтобы проиллюстрировать CASTing BLOB.

Simple Encoding App

Код в 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 выглядит следующим образом.

Debug Values

И результат вызова потока из браузера.

Browser Result

Теперь давайте разберемся, на какую кодировку мы смотрим. Взглянув на то, что я предполагаю, является входным BLOB, давайте посмотрим, совпадает ли BLOB с UTF-8.

70 72 7A 65 C5 82 C4 85 63 7A 6E 69 63 61

UTF-8 - кодировка символов переменной ширины, которая устанавливает старший порядок бит для указания двух или более байтов. Мы также хотим страницу, которая показывает общие кодовые точки для UTF-8 Полный список символов для UTF-8 . Обратите внимание, что это на самом деле не завершено.

Глядя на первые 4 байта, ни один из них не имеет старшего бита на

70 72 7A 65 

И вышеупомянутый список символов говорит, что это prze пока все хорошо.

Затем мы нажимаем C8, у которого включен бит старшего разряда. При небольшом визуальном разборе мы получаем два набора вероятных двухбайтных пар символов

C5 82
C4 85

Обращаясь к списку символов, наши две пары кандидатов фактически соответствуют двум нужным символам и следующие шесть символов, которые не имеют своих старших битов, переводятся в cznica . Выглядит очень хорошо.

Теперь, чтобы исключить другие возможные варианты кодирования.

UTF-16 использует 2 или 4 байта для представления каждого символа в зависимости от 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 не совпадают с двумя желаемыми символами, и поэтому мы можем устранить его.

...