본문 바로가기
ERP-SAP/ABAP

<ABAP> 1byte 를 2byte 로 인식해서 문자를 잘라내는 방법( open dataset 등등)

by 행복한워니의 기록 2016. 9. 22.
728x90
반응형

참조 
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. 




마지막으로도 한글이 몇자리수인지 카운트 하는 방법이 있는데 
아래와 같은 코딩을 쓴다고 한다.  그러나 위에 방법이 더 효과적이라 생각한다.
우리는 카운트를 하려는게 목적이 아닌.. 길이만큼 잘라내려고 하는게 목적이어서..

DATAI TYPE I,
      J TYPE I.
DATA: STR(100TYPE 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(1BETWEEN '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


728x90
반응형