中文字符截取亂碼問題

又是非Unicode老系統問題,當有中文時,截取就成問題,緣由是中文佔兩字節,而英文只佔一個字節,而在老R3系統中C類型只佔一個字節。
思路:將字符統一轉換成Unicode後截取

DATA: s TYPE string.
s = '1a的的的b1才才才餓餓餓d1是是是e1哦哦哦'.
WRITE:/ s .
WRITE:/ s+14(5)."直接取會出亂碼!!
PERFORM frm_substring USING s s 14 5."從第15個字符開始取,取5個字符
WRITE: / s.
*&---------------------------------------------------------------------*
*&      Form  frm_substring
*&---------------------------------------------------------------------*
*       老R3(非Unicode系統)字符串截
*----------------------------------------------------------------------*
*      -->P_SRC  text  原字符串
*      -->P_SUB  text  截取後的字符串
*      -->P_off  text  起始索引(從0開始)
*      -->P_LEN  text  截取長度
*----------------------------------------------------------------------*
FORM frm_substring  USING    p_src
                             p_sub
                             p_off
                             p_len.
  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-16BE'
    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 = p_src )."編碼
  xstr =  convout->get_buffer( ).
  WRITE: / xstr."
  DATA:truc_str TYPE string,off TYPE i,len TYPE i.
  truc_str = xstr.
  off = p_off * 4.
  len = p_len * 4.
  truc_str = truc_str+off(len).
  WRITE / truc_str."截取得到的二進串
  DATA: rf_elem_typ TYPE REF TO cl_abap_elemdescr.
  DATA: rf_c TYPE REF TO data.
  FIELD-SYMBOLS: <fs_c> TYPE x .
  DATA: c_len TYPE i.
  c_len = 2 * p_len."Unicode字符,每一個佔2個字節
  rf_elem_typ ?= cl_abap_elemdescr=>get_c( c_len ).
  CREATE DATA rf_c TYPE HANDLE rf_elem_typ.
  ASSIGN rf_c->* TO <fs_c> CASTING.
  <fs_c> = truc_str.

  DATA: convin TYPE REF TO cl_abap_conv_in_ce.
  convin = cl_abap_conv_in_ce=>create( encoding = l_encoding input = <fs_c> ).
  DATA: str TYPE string.
  CALL METHOD convin->read"解碼
    IMPORTING data = p_sub.
ENDFORM.                    " frm_substring
相關文章
相關標籤/搜索