【ABAP系列】SAP ABAP 字符編碼與解碼、Unicode


公眾號: matinal
本文作者: matinal
 

 

前言部分

大家可以關注我的公眾號,公眾號里的排版更好,閱讀更舒適。

正文部分

本文為轉載文章

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

JavaABAP內存存儲字符時,都是以Unicode來編解碼的

 

注:平時我們講的字節序是以字節為單位,字節與字節是有高低之分的,但在某個字節里是沒有高低位之分的。就像下面江字那樣,在低字節系統中為5F6C,而決不可能出現 F5 或 C6 之類的情況出現。

“江”字的Unicode編碼為:27743(十進制),6C5F(十六進制)

 

 

 

從上面可以看出:Java中的Unicode編碼是采用高字節序(符合人的閱讀習慣),而ABAP中是采用低字節序(符合機器存儲結構)(注意,可能與測試的環境有關。經測試,與測試環境確實有關系,請看下面在AIX機器上的測試結果——高字節順序——高字節在前,低字節在后,符合人的閱讀習慣,但與機器存儲剛好相反——內存是從左到右字節地址越來越大,即內存前面是低字節,而后面是高字節。正是因為ABAP不像Java那樣跨平台,所以在ABAP中可以通過CL_ABAP_CHAR_UTILITIES=>ENDIAN獲得當前SAP所在的服務器的字節序類別;但是Java是跨平台的,在任何平台下都是采用上面的高字節序)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM