Декодировать base64, содержащий текст XML, в строковую переменную - PullRequest
2 голосов
/ 15 марта 2019

Я не могу декодировать XML, предоставленный в формате base64, строковая переменная (lv_string) показывает что-то нечитаемое.

Пример:

Ü-AII # è-'﮹ïn ÷ ETH # èMÃÛmõØMôÛm'ë ## ë ~ # ë # ½èN »Ü = ¶ãÞwà] # ßÍüß # YO = õÛm'ï ~ Œ ^ # ë # мкА. # èN¹Ü = ¶ïÞ¹ï

Вот код:

Data: lt_content    Type standard table of x255,
      lv_xstring    Type xstring,
      lv_string     Type string,
      encod         Type Abap_encoding Value 4110.

Select Single xml_dte into @Data(xml_b64)
 From zmmvf_edocdet 
  Where numinterno = '0000000012'.

  IF Sy-subrc Eq 0.

    Call function 'SCMS_BASE64_DECODE_STR'
     Exporting
      Input         = xml_b64
     Importing
      Output        = lv_xstring
     Exceptions
      Failed        = 1
      Others        = 2.

    If Sy-subrc Eq 0.

      Data(lv_len) = xstrlen( lv_xstring ).
      Call function 'SCMS_XSTRING_TO_BINARY'
       Exporting
        buffer        = lv_xstring
       Importing
        output_length = lv_len
       Tables
        binary_tab    = lt_content[].

      Call function 'SCMS_BINARY_TO_STRING'
       Exporting
        input_length = lv_len
*        encoding     = encod
       Importing
        text_buffer  = lv_string
       Tables
        binary_tab   = lt_content[]
       Exceptions
        failed       = 1
        Others       = 2.
    ENDIF.
  ENDIF.

Ответы [ 2 ]

4 голосов
/ 16 марта 2019

У меня тоже была эта проблема в прошлом.Вы можете использовать следующее

data:
  lv_base64 type string,
  lv_xstring type xstring,
  lv_output type string.

* example base64 string
lv_base64 = 'PGh0bWw+PGhlYWQ+PHRpdGxlPlRpdGxlPC90aXRsZT48L2hlYWQ+PGJvZHk+PHA+SGVsbG8gV29ybGQ8L3A+PC9ib2R5PjwvaHRtbD4='.

* convert base64 to binary (xstring)
call function 'SCMS_BASE64_DECODE_STR'
    exporting
      input  = lv_base64
    importing
      output = lv_xstring
    exceptions
      failed = 1
      others = 2.

* use codepage conversion to convert xstring to string (UTF-8)
* catch possible conversion errors
  try.

      lv_output = cl_abap_codepage=>convert_from( source = lv_xstring ).

    catch cx_parameter_invalid_range .
    catch cx_sy_codepage_converter_init .
    catch cx_sy_conversion_codepage .
    catch cx_parameter_invalid_type .
  endtry.

  write lv_output.

В результате получается следующий вывод

<html><head><title>Title</title></head><body><p>Hello World</p></body></html>

Вы можете управлять преобразованием с помощью дополнительных параметров, например:

, если вы предпочитаетеиметь другую кодовую страницу

, если вы хотите заменить невидимые символы специальным символом

, если хотите игнорировать ошибки преобразования

lv_output = cl_abap_codepage=>convert_from(
    source      = lv_xstring
    codepage    = <your favourite codepage here>
    replacement = <conversion char for not convertible chars>
    ignore_cerr = <pass 'X' to ignore conversion errors>
).
0 голосов
/ 16 марта 2019

Краткое решение, если мы предположим, что строка base64 содержит XML в кодировке UTF-8, заключается в использовании метода DECODE_BASE64 класса CL_HTTP_UTILITY:

lv_string = cl_http_utility=>if_http_utility~decode_base64( xml_b64 ).

Минимальный, полный и проверяемый пример:

(пожалуйста, позвольте мне использовать хороший пример @manuel_b)

DATA(xml_b64) = `PGh0bWw+PGhlYWQ+PHRpdGxlPlRpdGxlPC90aXRsZT48L2hlYWQ+`
             && `PGJvZHk+PHA+SGVsbG8gV29ybGQ8L3A+PC9ib2R5PjwvaHRtbD4=`.

DATA(lv_string) = cl_http_utility=>if_http_utility~decode_base64( xml_b64 ).

ASSERT lv_string = `<html><head><title>Title</title></head><body><p>Hello World</p></body></html>`.
...