В первой части я объясняю, как кодировать строку символов в заданную кодовую страницу (все делается в памяти), а во второй части я конкретно объясняю, как записывать файлы на сервер приложений в заданной кодовая страница.
- Общий способ (все в памяти)
Если необходимо закодировать строку символов (тип STRING
), результат должен храниться в строке байтов, которая соответствует встроенному типу данных XSTRING
.
Существует несколько возможностей, которые зависят от версии ABAP; Я использую:
Начиная с версии 7.53, используйте класс CL_ABAP_CONV_CODEPAGE
:
DATA (xstring) = cl_abap_conv_codepage => create_out ( codepage = `UTF-16LE`) -> convert (source =` ABCDE`).
Начиная с 7.02, используйте класс CL_ABAP_CODEPAGE
:
DATA xstring TYPE xstring.
xstring = cl_abap_codepage => convert_to (source = `ABCDE` codepage =` UTF-16LE`).
До 7.02 используйте класс CL_ABAP_CONV_OUT_CE
(документация предоставляется вместе с классом):
Сначала создайте экземпляр объекта преобразования, используйте номер кодовой страницы SAP вместо имени ISO (список значения, показанные ниже):
ДАННЫЕ: conv ТИП ОТНОСИТЕЛЬНО CL_ABAP_CONV_OUT_CE, xstring TYPE xstring.
conv = CL_ABAP_CONV_OUT_CE => CREATE (кодировка = '4103'). "4103 = utf-16le
Затем закодируйте строку и получите закодированные байты:
conv-> RESET ().
conv-> WRITE (data = `ABCDE`).
xstring = conv-> GET_BUFFER ().
В конечном итоге вместо использования RESET
, WRITE
и GET_BUFFER
, метод CONVERT
был добавлен в 6.40 и ретропортирован:
conv-> CONVERT (EXPORTING data = `ABCDE` IMPORTING buffer = xstring).
Для класса CL_ABAP_CONV_OUT_CE
необходимо использовать номер кодовой страницы SAP, а не имя ISO. Вот наиболее распространенные кодовые страницы SAP и их эквивалентные имена ISO:
- 1100: ISO-8859-1
- 1101: US-ASCII
- 1160: Windows -1252 ("ANSI")
- 1401: ISO-8859-2
- 4102: UTF-16BE
- 4103: UTF-16LE
- 4104: UTF-32BE
- 4105: UTF-32LE
- 4110 : UTF-8
- Et c. (Возможные значения определены в таблице
TCP00A
, в строках со столбцом CPATTRKIND = 'H'
).
Запись файла на сервере приложений в заданной кодовой странице В ABAP OPEN DATASET
может напрямую указывать целевую кодовую страницу, поддерживается большинство кодовых страниц, включая UTF-8
, но не другие UTF
(кодовые страницы 41xx), что может быть сделано только решением, описанным в 2.3 ниже (с помощью первой кодировки в памяти).
- 2.1)
IN TEXT MODE ENCODING ...
Возможные ENCODING
значения:
UTF-8
: в этом режиме можно добавить метку порядка байтов, если необходимо, через опция WITH BYTE-ORDER MARK
. DEFAULT
: будет UTF-8 в системе SAP "Юникод" (которую можно проверить через меню Система> Статус> Система Юникод Да / Нет), в противном случае - НЕ ЮНИКОД . NON-UNICODE
: будет зависеть от текущей среды ABAP linguisti c; для языка Engli sh это кодировка символов iso-8859-1
, для языка Poli sh это кодировка символов iso-8859-2
, et c. (эквивалентности показаны в таблице TCP0C
.)
Пример в ABAP версии 7.52 для записи в UTF-8
с меткой порядка байтов:
REPORT zmyprogram.
DATA(filename) = `/tmp/dataset_utf_8`.
OPEN DATASET filename IN TEXT MODE ENCODING UTF-8 WITH BYTE-ORDER MARK FOR OUTPUT.
TRY.
TRANSFER `Witaj świecie` TO filename.
CATCH cx_sy_conversion_codepage INTO DATA(lx).
" Character not supported in language code page
ENDTRY.
CLOSE DATASET filename.
Пример в ABAP версия 7.52 для записи на iso-8859-2
(язык * Poli sh здесь):
REPORT zmyprogram.
SET LOCALE LANGUAGE 'L'. " Polish
DATA(filename) = `/tmp/dataset_nonunicode_pl`.
OPEN DATASET filename IN TEXT MODE ENCODING NON-UNICODE FOR OUTPUT.
TRY.
TRANSFER `Witaj świecie` TO filename.
CATCH cx_sy_conversion_codepage INTO DATA(lx).
" Character not supported in language code page
ENDTRY.
CLOSE DATASET filename.
- 2.2)
IN LEGACY TEXT MODE CODE PAGE ...
Используйте любой номер кодовой страницы, кроме кода страницы 41xx (т. е. UTF-8
и другие UTF
; см. обходной путь в разделе 2.3 ниже).
Пример записи в ABAP версии 7.52 для записи в iso-8859-2
(кодовая страница 1401):
REPORT zmyprogram.
DATA(filename) = `/tmp/dataset_iso_8859_2`.
OPEN DATASET filename IN LEGACY TEXT MODE CODE PAGE '1401' FOR OUTPUT. " iso-8859-2
TRY.
TRANSFER `Witaj świecie` TO filename.
CATCH cx_sy_conversion_codepage INTO DATA(lx).
" Character not supported in language code page
ENDTRY.
CLOSE DATASET filename.
- 2.3)
UTF = general way + IN BINARY MODE
Пример в ABAP версии 7.52:
REPORT zmyprogram.
TRY.
DATA(xstring) = cl_abap_codepage=>convert_to( source = `Witaj świecie` codepage = `UTF-16LE` ).
CATCH cx_sy_conversion_codepage INTO DATA(lx).
" Character not supported in language code page
BREAK-POINT.
ENDTRY.
DATA(filename) = `/tmp/dataset_utf_16le`.
OPEN DATASET filename IN BINARY MODE FOR OUTPUT.
TRANSFER xstring TO filename.
CLOSE DATASET filename.