[SAP ABAP開發技術總結]字符編碼與解碼、Unicode


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 = ' 江正軍 ' ). " 編碼
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 . "
江正軍

使用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     
= '江正軍'
  codepage   
= `UTF-8` ).
WRITE: / xstr.
"解碼
str
= cl_abap_codepage=>CONVERT_FROM(
  source     
xstr
  codepage   
= `UTF-8` ).

WRITE: / str.

4110
4110
E6B19FE6ADA3E5869B

江正軍

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是與平台無關的,在任何平台上都是高字節序),從這里就可以看出WindowsUnix上的字節序不是一樣的。

"====分配時指定類型
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

JAVAABAP中的Unicode

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

 

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

 

 

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

image050_thumb

 

image051_thumb

image052_thumb

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

 

image053_thumb


免責聲明!

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



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