FTP나 EDI로 외부 시스템에 고정 길이 파일을 송신할 때, 한글이 섞이면 골치가 아픕니다. 영문·숫자·특수문자는 1바이트인데 한글은 2바이트라서, 단순히 ABAP 문자 수로 잘라 보내면 수신 측에서 자릿수가 어긋나거나 글자가 깨져버립니다.
이번 글에서는 바이트(BYTE) 단위로 정확하게 잘라서 송신하는 방법을 정리합니다. 핵심은 SAP 표준 클래스 CL_ABAP_LIST_UTILITIES 의 두 메소드입니다.
문제 — 문자 수와 바이트 수는 다르다
ABAP의 표준 문자열 연산(+0(25), STRLEN)은 문자 단위로 작동합니다. 하지만 외부 시스템(특히 일본·한국 EDI 표준)은 바이트 단위의 고정 길이를 요구하는 경우가 많아요.
| 문자 종류 | 바이트 | 예시 |
|---|---|---|
| 영문 (반각) | 1 byte | A, B, z |
| 숫자 (반각) | 1 byte | 0, 1, 9 |
| 특수문자·띄어쓰기 (반각) | 1 byte | -, _, (space) |
| 한글 (전각) | 2 byte | 가, 나, 한 |
예: "한국 ABC" 는 ABAP에서 6문자지만 바이트로는 2(한)+2(국)+1(공백)+1(A)+1(B)+1(C) = 8 byte.

핵심 클래스 — CL_ABAP_LIST_UTILITIES
SAP는 이 문제를 위해 두 개의 표준 메소드를 제공합니다.
| 메소드 | 역할 |
|---|---|
DYNAMIC_OUTPUT_LENGTH |
필드의 바이트 길이 계산. 한글은 2, 영문은 1로 자동 계산 |
READ_FROM_DISPLAY_LAYOUT |
지정한 바이트 위치·길이로 잘라내기. 한글 경계가 잘릴 경우 자동으로 그 한글 글자 통째로 버려서 깨짐 방지 |
특히 두 번째 메소드의 자동 안전 처리가 핵심입니다. 단순 OFFSET 자르기로는 "한국"의 "한" 만 잘려서 깨진 바이트가 송신되지만, 이 메소드는 그런 경계는 알아서 잘라내고 한글 통째로 버립니다.
사용 절차
1단계 — 바이트 길이 계산
먼저 송신할 값의 실제 바이트 길이를 확인합니다.
DATA: lv_text TYPE string,
lv_len TYPE i.
lv_text = '한국 ABC'. " 6 문자, 8 byte
cl_abap_list_utilities=>dynamic_output_length(
EXPORTING
field = lv_text
RECEIVING
len = lv_len ).
" lv_len = 8
2단계 — 송신 길이와 비교
EDI 표준이 요구하는 고정 길이(예: 25 byte)와 비교해서 초과 시에만 자르도록 분기합니다.
IF lv_len > 25.
" 자르기 필요
ELSE.
" 그대로 사용
ENDIF.
3단계 — 바이트 단위로 자르기
초과 시 READ_FROM_DISPLAY_LAYOUT 호출.
DATA: lv_cut_text TYPE string.
cl_abap_list_utilities=>read_from_display_layout(
EXPORTING
display_data = lv_text
display_offset = 0 " 시작 위치 (byte)
display_length = 25 " 자를 길이 (byte)
IMPORTING
field = lv_cut_text ).
결과: lv_cut_text 가 25 byte 이내로 잘려서 반환. 한글 경계 자동 처리됨.

4단계 — 송신 레코드에 적용
내부 테이블 LOOP 안에서 송신 레코드 생성 시 다음 패턴으로 사용:
LOOP AT lt_input INTO ls_input.
" 1) 바이트 길이 확인
cl_abap_list_utilities=>dynamic_output_length(
EXPORTING
field = ls_input-text_field
RECEIVING
len = lv_len ).
" 2) 25 byte 초과 시 자르기
IF lv_len > 25.
cl_abap_list_utilities=>read_from_display_layout(
EXPORTING
display_data = ls_input-text_field
display_offset = 0
display_length = 25
IMPORTING
field = ls_record-output_field ).
ELSE.
ls_record-output_field = ls_input-text_field.
ENDIF.
" 3) EDI 헤더 코드와 결합 (선택)
CONCATENATE '001' ls_record-output_field
INTO ls_record-output_field.
APPEND ls_record TO lt_record.
ENDLOOP.

주의사항
길이 부족 시 공백 패딩
송신 표준이 정확히 N 바이트(예: 25 byte 정확히 채워야 함)를 요구하는 경우, 자르기 후에도 부족분은 공백으로 채워야 합니다.
" 자른 후 부족분 right-padding
DATA(lv_padded) = ls_record-output_field.
WHILE strlen( lv_padded ) < 25. " 단순 문자 길이로 비교 (영문 전용)
CONCATENATE lv_padded ' ' INTO lv_padded.
ENDWHILE.
단, 한글이 섞인 경우 다시 바이트 길이로 계산해서 패딩 길이 조정 필요.
항상 두 메소드를 같이 쓸 것
DYNAMIC_OUTPUT_LENGTH 로 사전 길이 체크 없이 무조건 READ_FROM_DISPLAY_LAYOUT 을 호출해도 동작은 하지만, 짧은 텍스트(예: 5 byte)에 25 byte 자르기 요청 시 뒷부분이 공백으로 채워질 수 있습니다. 의도한 동작이 아니라면 사전 체크 필수.
Unicode 시스템 전제
이 글의 모든 내용은 Unicode 활성 SAP 시스템(SAP NetWeaver 7.0+ 표준) 기준입니다. 옛 Non-Unicode 시스템에서는 동작이 다를 수 있어요.
파일 인코딩과 일치시키기
ABAP 안에서는 정확히 byte 길이로 잘랐지만, 최종 파일 생성 시 인코딩(UTF-8, EUC-KR, CP949)이 수신 측 기대와 다르면 같은 한글이라도 바이트 수가 달라질 수 있습니다.
- CP949 / EUC-KR: 한글 1자 = 2 byte (한국 EDI 표준)
- UTF-8: 한글 1자 = 3 byte
- 이 클래스는 CP949 / EUC-KR 기준 계산 (SAP 표준 출력 레이아웃)
송신 표준과 인코딩을 먼저 확인하고 적용하세요.
성능 — 대량 LOOP에서 빈번 호출 시
수만 건 LOOP 안에서 두 메소드를 반복 호출하면 약간의 오버헤드가 있습니다. 짧은 텍스트가 대부분이라면 사전에 STRLEN 으로 빠르게 추정 필터링 후 의심 가는 항목만 정밀 계산하는 패턴이 유리합니다.
요약
| 단계 | 작업 |
|---|---|
| 1 | DYNAMIC_OUTPUT_LENGTH 로 실제 byte 길이 계산 |
| 2 | 송신 표준 길이(N byte)와 비교 |
| 3 | 초과 시 READ_FROM_DISPLAY_LAYOUT 으로 byte 단위 자르기 |
| 4 | 송신 레코드에 적용 + 필요 시 공백 패딩 |
FTP·EDI 송신에서 byte 길이 처리는 한글 데이터를 다루는 한국 SAP 환경에서 거의 필수 작업입니다. CL_ABAP_LIST_UTILITIES 두 메소드만 익혀두면 한글 경계 깨짐 없이 안전하게 송신할 수 있습니다.
Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다. SAP 시스템 인코딩 설정과 수신 표준 인코딩이 일치하는지 적용 전 반드시 확인하시기 바랍니다.
'ABAP 문법 & 기법' 카테고리의 다른 글
| [SAP ABAP] RFC 펑션 모듈 종류 — Normal · Remote-Enabled 차이와 선택 기준 (SE37) (0) | 2026.05.12 |
|---|---|
| [SAP ABAP] Function·Table 어디에 쓰이는지 찾는 법 — Where-Used 영향도 분석 (0) | 2026.05.12 |
| [SAP ABAP] 여러 GRID에서 공통 CLASS EVENT 사용하기 — FOR ALL INSTANCES + SENDER (0) | 2026.05.12 |
| [SAP ABAP] 동적 TABLE & ITAB 생성하기 — RTTS(RTTI + RTTC) 활용 (0) | 2026.05.12 |
| [SAP ABAP] AMDP 생성·호출 방법 — HANA DB 프로시저 가이드 (0) | 2026.05.08 |