본문 바로가기
ABAP/개발Tip

[개발Tip] ASCII 기준 문자열 자르기

by name_text 2024. 10. 24.

ASCII 기준 문자열 자르기

2Byte 문자열 자르기

 

EDI 통신을 할때 종종 필드별로 최대 Byte를 제한하는 경우가 있습니다.

대부분의 시스템이 그렇듯 SAP도 Unicode를 사용하고 있다보니 strlen 으로 문자열의 길이를 확인하면 한글/영문 구분없이 모두 동일하게 문자 수만큼 반환이 됩니다.

 

하지만 EDI에서는 ASCII 기준으로 Byte 계산을 하는 경우가 많아, 원하는 Byte 만큼 문자열을 자르려면 별도의 처리가 필요합니다.

 

다행이도 SAP에서 다양한 방법을 제공하고 있고,

가장 일반적으로 사용하는 방법은 CL_ABAP_LIST_UTILITIES를 이용하여 간단하게 문자열의 크기를 구할 수 있습니다.

https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/index.htm?file=abencl_abap_list_utilities.htm

 

# 소스코드 예시

  class-methods SUBSTRING_USING_2BYTE
    importing
      value(IV_STRING) type STRING 
      value(IV_CUT_BYTE) type I
    returning
      value(RV_STRING) type STRING .
      
  METHOD SUBSTRING_USING_2BYTE.
    CLEAR rv_string.

    IF iv_string IS INITIAL OR iv_cut_byte IS INITIAL.
      RETURN iv_string.
    ENDIF.

    "문자열의 전체 길이가 iv_cut_byte보다 크면 우선 자름
    IF strlen( iv_string ) > iv_cut_byte.
      iv_string = iv_string(iv_cut_byte).
    ENDIF.

    "2Byte 기준 문자열 길이
    IF cl_abap_list_utilities=>dynamic_output_length( iv_string ) <= iv_cut_byte.
      RETURN iv_string.
    ENDIF.

    "단일 문자로 문자열 자르기
    DATA: lv_position TYPE i,
          lv_char     TYPE string.
    DATA(lv_count) = VALUE i( ).

    DO strlen( iv_string ) TIMES.
      lv_position = sy-index - 1.
      lv_char = iv_string+lv_position(1).
      lv_count += cl_abap_list_utilities=>dynamic_output_length( lv_char ).

      IF lv_count <= iv_cut_byte.
        rv_string = |{ rv_string }{ lv_char }|.
      ELSE.
        EXIT.
      ENDIF.
    ENDDO.
  ENDMETHOD.

 

댓글