К основному контенту

Перекодирование текста в ABAP

В перекодировании текста в ABAP есть только одна загвоздка - номер кодировки для SAP. Решив этот вопрос - легко решается все остальное. По этому поводу я решил написать маленькую программку, которая конвертирует текст из UTF-8 в UTF-16LE. Цель этого скрипта не просто показать конкретно конвертирование кодировок, а создать некоторую универсальность и понятность в перекодировании в целом.
REPORT z_test.
 
DATA: lv_extname_from TYPE string. " Внешнее имя кодировки из которой кодируем
DATA: lv_extname_to TYPE string. " Внешнее имя кодировки в которую кодируем
DATA: lv_codepage_from TYPE cpcodepage. " Номер кодировки в САПе из которой кодируем
DATA: lv_codepage_to TYPE cpcodepage. " Номер кодировки в САПе в которую кодируем
DATA: lv_doc TYPE string. " Текст для перекодирования
 
DATA: go_conv_obj TYPE REF TO cl_abap_conv_obj. " Объект для перекодирования
 
START-OF-SELECTION.
 
  MOVE: 'UTF-8' TO lv_extname_from.
  MOVE: 'UTF-16LE' TO lv_extname_to.
 
  MOVE: 'Test message' TO lv_doc.
 
* Получим номер кодировки САПа по внешнему имени
  CALL FUNCTION 'SCP_CODEPAGE_BY_EXTERNAL_NAME'
    EXPORTING
      external_name = lv_extname_from
    IMPORTING
      sap_codepage  = lv_codepage_from
    EXCEPTIONS
      not_found     = 1
      OTHERS        = 2.
  IF sy-subrc <> 0.
    WRITE: / 'CodePage FROM Error #', sy-subrc, ''.
    STOP.
  ENDIF.
 
* Получим номер кодировки САПа по внешнему имени
  CALL FUNCTION 'SCP_CODEPAGE_BY_EXTERNAL_NAME'
    EXPORTING
      external_name = lv_extname_to
    IMPORTING
      sap_codepage  = lv_codepage_to
    EXCEPTIONS
      not_found     = 1
      OTHERS        = 2.
  IF sy-subrc <> 0.
    WRITE: / 'CodePage TO Error #', sy-subrc, ''.
    STOP.
  ENDIF.
 
  WRITE: / 'Encode from',lv_extname_from, 'to', lv_extname_to.
 
 
  WRITE: / 'Encoding.START'.
 
* Создадим объект для перекодирования из одной кодировки в другую
  CREATE OBJECT go_conv_obj
    EXPORTING
      incode  = lv_codepage_from
      outcode = lv_codepage_to.
 
* Вызываем метод конвертации
  go_conv_obj->convert(
    EXPORTING
      inbuff = lv_doc
      outbufflg = 0
    IMPORTING outbuff = lv_doc ).
 
  WRITE: / 'Encoding.STOP'.

Таким образом можно конвертировать из одной кодировки в другую. Для этого достаточно знать лишь внешнее название кодировки.

Комментарии