참조
https://wiki.scn.sap.com/wiki/display/ABAP/Character+encoding+conversion
https://wiki.scn.sap.com/wiki/display/ABAP/CL_ABAP_CONV_IN_CE
**맨 아래 완성 코딩링크가 있음.
꼭 테스트 해보길 바람.. (아래와 다름)**
(값을 스트럭쳐에 담아준다곤 하는데.. 테스트 해봐야 함)
Class Name: CL_ABAP_CONV_IN_CE
Method Name: CONVERT_STRUC
DATA:
ld_INPUT TYPE XSEQUENCE ,
ld_VIEW TYPE CL_ABAP_VIEW_OFFLEN ,
ld_DATA TYPE ANY ,
ld_INPUT_TOO_SHORT TYPE ABAP_BOOL.
" ld_INPUT = "<Populate with value>
" ld_VIEW = "<Populate with value>
DATA: lo_CE TYPE REF TO CL_ABAP_CONV_IN_CE .
- CALL METHOD lo_CE->CONVERT_STRUC(
- EXPORTING
- INPUT = ld_INPUT
- VIEW = ld_VIEW
- IMPORTING
- DATA = ld_DATA
- INPUT_TOO_SHORT = ld_INPUT_TOO_SHORT
- EXCEPTIONS
- CX_SY_CONVERSION_CODEPAGE = 1
- CX_SY_CODEPAGE_CONVERTER_INIT = 2
- CX_PARAMETER_INVALID_TYPE = 3
- CX_PARAMETER_INVALID_RANGE = 4 ).
-
-
- 성공한 되는 방법은
- DATA : I_TEXT(2000).
- DATA : I_OFFSET TYPE I.
- DATA : I_OUTLENTH TYPE I.
- DATA : E_TEXT TYPE STRING.
- DATA : E_RC TYPE ABAP_LIST_REPL_RC.
-
- i_text = 'ABCDE원이짱12345'.
- I_OFFSET = 5.
- I_OUTLENTH = 6.
-
- call method cl_abap_list_utilities=>read_from_display_layout
- exporting
- display_data = i_text
- display_offset = i_offset
- display_length = i_outlenth
- importing
- field = e_text.
-
- 원래 유니코드 상태에서는 5(6) 이라면 원이짱123 까지 나오게 되는데
- 위의 과정을 거치면 "원이짱" 만 나오게 된다.
-
-
-
- 그 외에 또 다른 방법은
-
- STR1 = '가나다ABC123'.
- LV_STR = STRLEN( STR1 ).
-
- DO LV_STR TIMES.
- CALL_METHOD CL_ABAP_LIST_UITILIES=>DYNAMIC_OUTPUT_LENGTH
- EXPORTING
- FIELD = STR1
- RECEIVING
- LEN = LV_LEN.
-
- 이걸로 각각의 필드의 진짜 길이(한글 2바이트로 계산한 길이) 를 알수 있다.
- 이걸 기준으로 쪼개도 된다.
-
- ENDDO.
-
-
-
-
- 마지막으로도 한글이 몇자리수인지 카운트 하는 방법이 있는데
- 아래와 같은 코딩을 쓴다고 한다. 그러나 위에 방법이 더 효과적이라 생각한다.
- 우리는 카운트를 하려는게 목적이 아닌.. 길이만큼 잘라내려고 하는게 목적이어서..
-
- DATA: I TYPE I,
J TYPE I.
DATA: STR(100) TYPE C VALUE 'A홍길동B'.
DATA: LV_LENGTH TYPE I.
DATA:
BUFFER1 TYPE XSTRING, "KSC5601 HEXA 값
CONV TYPE REF TO CL_ABAP_CONV_OUT_CE.
I = STRLEN( STR ).
TRY.
CONV = CL_ABAP_CONV_OUT_CE=>CREATE(
ENCODING = '8500'
ENDIAN = 'L' ). " LITTEL ENDIAN 'L', BIG ENDIAN 'B'
CONV->CONVERT( EXPORTING DATA = STR
IMPORTING BUFFER = BUFFER1 ).
DO I TIMES.
IF BUFFER1+J(1) BETWEEN '00' AND '7F'. "ASC코드 인지판별 즉 1바이트문자인지 판별
LV_LENGTH = LV_LENGTH + 1.
J = J + 1.
ELSE. "ASC코드가 아니면 2BYTE문자열
LV_LENGTH = LV_LENGTH + 2.
J = J + 2.
ENDIF.
ENDDO.
CATCH CX_ROOT.
ENDTRY.
WRITE:/ LV_LENGTH. -
-
-
- 맨 위에 썬 첫번째 방법은 1BYTE 로 쓴 한글들을 자동으로 2BYTE 로 인식해서
- 내가 길이를 지정한 스트럭쳐에 자동으로 담아준다라는 이야기를 들어서 테스트 해보려고 하는것.
- 예를들어 총 30자리(바이트개념으로 한글은 2바이트로 카운트)길이를 가진 파일을 읽었다고 하자
-
- '12345AAAAA여기는구의77777 1234'
-
- 이런데이터를 받았다고 치자.
- 그걸 스트럭쳐에 옮겨담아야 하는데
- 담겨야할 필드들의 속성값이
- 일련번호(5)
- 일련번호2(5)
- 비고정보(10)
- 기타정보(6)
- 기타정보2(4) 해서 총 30자리라면...
-
- 유니코드인 상태에서는
- 비고정보(10) 쪽에서 문제가 발생한다.
- 즉, 우리한테 보낸 파일들은 2바이트로 계산해서 파일을 던진거기에
- 비고정보(10) 에 '여기는구의' 만 들어가길 바라게 된다.
-
- 그러나 실제로 유니코드 상태에서 한글 또한 1바이트처럼 인식하기 때문에
- 비고정보(10) 에 담기는건 '여기는구의77777' 까지 담기게 된다
-
- 그렇기에 저 30자리 길이를 가진 파일을 유니코드가 아닌것처럼 변환후에
- 스트럭쳐에 MOVE A(읽은파일) TO B(받을 스트럭쳐). 하면
- 깨끗하게 들어가게 될 것이다..
-
- 그래서 위와 같은 방법들을 고민하였고..
- 제일 첫번째꺼는 이걸 한번에 다 변환해서 스트럭쳐에 스르륵 넣을 수 있는지 찾아야 되기에 연습하려 한 것이다.
-
- 우선 된다고는 들었다...방법에 대한 연구가 필요할 뿐..
-
-
report zunicode_035.
parameters p_buf1(100) type c.
data: begin of struc,
text(10) type c,
int type i,
end of struc.
data: buffer type xstring,
conv type ref to cl_abap_conv_in_ce,
view type ref to cl_abap_view_offlen.
buffer = p_buf1.
view = cl_abap_view_offlen=>create_legacy_view( struc ).
conv = cl_abap_conv_in_ce=>create(
encoding = '8500'
endian = 'B'
input = buffer
).
*TRY.
call method conv->convert_struc
exporting
input = buffer
view = view
importing
data = struc.
* input_too_short =
.
*
*CALL METHOD conv->read(
* EXPORTING n = l_len
* IMPORTING data = L_text
* ).
write : struc-text, struc-int.
http://www.sapjoy.co.kr/?document_srl=422895
문자가 깨지는 이유는 업로드 한 charset과 출력하는 charset이 달라서 그런 것 같습니다.
DATA : conv_in TYPE REF TO cl_abap_conv_in_ce,
conv_out TYPE REF TO cl_abap_conv_out_ce,
lv_xstr TYPE xstring.
conv_in = cl_abap_conv_in_ce=>create( encoding = 'UTF-8' ).
conv_out = cl_abap_conv_out_ce=>create( encoding = '8500' ).
*--- charset 변경로직.
conv_out->convert(
EXPORTING data = lv_str
IMPORTING buffer = lv_xstr ).
conv_in->convert(
EXPORTING input = lv_xstr
IMPORTING data = lv_str ).
완성본
https://nightsforu.tistory.com/m/457
'ERP-SAP > ABAP' 카테고리의 다른 글
(abap) 문자속 특수문자 찾기 숫자속 문자 찾기 find character in string or in number (0) | 2018.03.15 |
---|---|
<ABAP> 1byte 를 2byte 로 인식해서 문자를 잘라내는 방법( open dataset 등등)-결과 코딩 (0) | 2016.10.14 |
currency 필드 db 저장시 변환 로직( 통화 관련 금액 자동 변환 로직) (0) | 2015.10.27 |
<ABAP> SOURCE CODE 다운로드 / 소스 다운로드 (4) | 2015.04.17 |
<ABAP> 현재 실행중인 Function 명 / 프로그램 명 가져오기. (0) | 2015.03.03 |