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

Перекодирование текста в 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'.

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

Комментарии

Популярные сообщения из этого блога

Прямые ссылки на файлы Google диска

В предыдущей статье я рассказал, как подключить свой JavaScript файл к блогу BLOGSPOT . Но для того, что бы их подключить нужны прямые ссылки на файл, а Google диск при предоставлении общего доступа к файлу выдает ссылку на предварительный просмотр, которая никак напрямую не ссылается на файл. Для Google диска прямая ссылка на файл - это ссылка на скачивание. Ниже описаны два способа создания ссылки на скачивание на примере файла prism.js.

События для ведения таблиц

Как и всегда, в пылу проекта внезапно родилась Z табличка. Главный нюанс был в том, что она должна была хранить пароли для авторизации на стороннем сервере. Естественно, никто не хотел хранить пароли в открытом виде, а двустороннее шифрование SAP не умеет без сторонних пакетов и надстроек. Далее, все как обычно - придумали алгоритм, сделали табличку. Дело осталось за малым - нужно шифровать пароли, которые вводит пользователь. Делать отдельную программу нет смысла, поскольку ее функционал мало чем будет отличаться от сгенерированного. Вот здесь на помощь приходят события! С их помощью можно, наверное, все. По крайней мере, я не нашел чего-либо, что нельзя сделать с данными через события.

OOP ALV GRID с HTML шапкой

В этой статье хочу постараться подробно описать и привести пример, как можно создать ALV отчет с таблицей на весь экран и с HTML шапкой вверху. Я не буду описывать начальный этап, где пишется селекционный экран или делается выборка данных. Будем считать, что основа у нас есть и нам нужно просто вывести данные. Главной изюминкой является то, что нужно вывести ALV GRID на экран без использования каких-либо дополнительных элементов на экране. Step-By-Step Шаг 1. Создание окна Создаем самое простое окно с номером 100. На него не нужно кидать никаких контейнеров. Оно нам нужно только для модулей PAI и PBO и вывода на него ALV GRID.