前言部分
大家可以關注我的公眾號,公眾號里的排版更好,閱讀更舒適。
正文部分
本文為轉載文章
DATA : xstr TYPE xstring .
DATA : l_codepage ( 4 ) TYPE n .
DATA : l_encoding ( 20 ).
********** 字符集名與內碼轉換
" 將外部字符集名轉換為內部編碼
CALL FUNCTION 'SCP_CODEPAGE_BY_EXTERNAL_NAME'
EXPORTING
external_name = 'UTF-8'
IMPORTING
sap_codepage = l_codepage .
l_encoding = l_codepage .
********** 編碼
DATA : convout TYPE REF TO cl_abap_conv_out_ce .
" 創建編碼對象
convout = cl_abap_conv_out_ce => create ( encoding = l_encoding ).
convout -> write ( data = 'matinal測試 ' ). " 編碼
xstr = convout -> get_buffer ( ). " 獲取碼流
WRITE : / xstr . "E6B19FE6ADA3E5869B
********** 解碼
DATA : convin TYPE REF TO cl_abap_conv_in_ce .
" 創建解碼對象
convin = cl_abap_conv_in_ce => create ( encoding = l_encoding input = xstr ).
DATA : str TYPE string .
CALL METHOD convin -> read " 解碼
IMPORTING data = str .
WRITE : / str . " matinal測試
使用CL_ABAP_CODEPAGE類進行編解碼:
DATA: xstr TYPE xstring,
str TYPE string,
l_codepage(4) TYPE n ,
l_encoding(20).
**********字符集名與內碼轉換
"將外部字符集名轉換為內部編碼
CALL FUNCTION 'SCP_CODEPAGE_BY_EXTERNAL_NAME'
EXPORTING
external_name = 'UTF-8'
IMPORTING
sap_codepage = l_codepage.
WRITE: / l_codepage.
"等同於下面類方法
l_codepage = cl_abap_codepage=>sap_codepage( 'UTF-8' ).
WRITE: / l_codepage.
"編碼
xstr = cl_abap_codepage=>convert_to(
source = 'matinal測試'
codepage = `UTF-8` ).
WRITE: / xstr.
"解碼
str = cl_abap_codepage=>CONVERT_FROM(
source = xstr
codepage = `UTF-8` ).
WRITE: / str.
4110
4110
E6B19FE6ADA3E5869B
matinal測試
ABAP中的特殊字符列表
cl_abap_char_utilities=>horizontal_tab — 09 TAB符
cl_abap_char_utilities=>CR_LF ———-- 0D0A 回車換行
cl_abap_char_utilities=>VERTICAL_TAB —- 0B 垂直制表符
cl_abap_char_utilities=>NEWLINE —---- 0A 換行
cl_abap_char_utilities=>FORM_FEED —--- 0C 換頁
cl_abap_char_utilities=>BACKSPACE —---08 退格符
CL_ABAP_CHAR_UTILITIES=>BYTE_ORDER_MARK_LITTLE-----(utf-16le')的文件頭
CL_ABAP_CHAR_UTILITIES=>BYTE_ORDER_MARK_UTF8-------(utf-8)的文件頭
如果是要單獨取得回車或者換行(不是回車加換行),可以采用:
cl_abap_char_utilities=>CR_LF(1)
cl_abap_char_utilities=>CR_LF 1(1)
空白字符:
System.out.println((int)' ');//12288
DATA: gc_result(50) TYPE c.
CONSTANTS: c_tab TYPE c VALUE cl_abap_char_utilities=>horizontal_tab.
CONCATENATE 'text01' c_tab 'text02' c_tab 'text03' INTO gc_result.
Unicode字符串互轉
DATA: c(4) TYPE c VALUE 'ABCD'.
FIELD-SYMBOLS <fs1>.
"將字符串以十六進制的Unicode碼來表示
ASSIGN c TO <fs1> type 'X'.
WRITE: / <fs1>.0041004200430044這是在AIX上測試的結果。注意,SAP上使用的是Unicode碼,所以為雙字節,在轉換為十六進制時,與服務器所在操作系統的字節順有關(Java是與平台無關的,在任何平台上都是高字節序),從這里就可以看出Windows與Unix上的字節序不是一樣的。
"====分配時指定類型
DATA: x(8) TYPE x ."這里的8表示8個字節
x = <fs1>.
FIELD-SYMBOLS <fs3> .
"將十六進制的Unicode碼轉換為字符串
ASSIGN x TO <fs3> type 'C'. "C在這里是一般類型,代指字符串,而不是只一個C
WRITE:/ <fs3>.
"====通過強轉
FIELD-SYMBOLS <fs4> TYPE c. "C在這里也是一般類型
ASSIGN x TO <fs4> CASTING.
WRITE:/ <fs4>.
4100420043004400
ABCD
ABCD
JAVA與ABAP中的Unicode
Java與ABAP內存存儲字符時,都是以Unicode來編解碼的。
注:平時我們講的字節序是以字節為單位,字節與字節是有高低之分的,但在某個字節里是沒有高低位之分的。就像下面江字那樣,在低字節系統中為5F6C,而決不可能出現 F5 或 C6 之類的情況出現。
“江”字的Unicode編碼為:27743(十進制),6C5F(十六進制)
從上面可以看出:Java中的Unicode編碼是采用高字節序(符合人的閱讀習慣),而ABAP中是采用低字節序(符合機器存儲結構)(注意,可能與測試的環境有關。經測試,與測試環境確實有關系,請看下面在AIX機器上的測試結果——高字節順序——高字節在前,低字節在后,符合人的閱讀習慣,但與機器存儲剛好相反——內存是從左到右字節地址越來越大,即內存前面是低字節,而后面是高字節。正是因為ABAP不像Java那樣跨平台,所以在ABAP中可以通過CL_ABAP_CHAR_UTILITIES=>ENDIAN獲得當前SAP所在的服務器的字節序類別;但是Java是跨平台的,在任何平台下都是采用上面的高字節序)