diff --git a/src/kernel/call_transformation/kernel_call_transformation.clas.abap b/src/kernel/call_transformation/kernel_call_transformation.clas.abap index d0c8cbc8..23c7b437 100644 --- a/src/kernel/call_transformation/kernel_call_transformation.clas.abap +++ b/src/kernel/call_transformation/kernel_call_transformation.clas.abap @@ -42,15 +42,21 @@ CLASS kernel_call_transformation IMPLEMENTATION. DATA lv_dummy TYPE string. DATA li_writer TYPE REF TO if_sxml_writer. DATA li_doc TYPE REF TO if_ixml_document. - DATA lv_str_bom TYPE string. - DATA lv_hex_bom TYPE xstring. + DATA lv_bom_big TYPE string. + DATA lv_bom_little TYPE string. + DATA lv_xstring TYPE xstring. CLEAR mi_doc. - lv_hex_bom = cl_abap_char_utilities=>byte_order_mark_big. - lv_str_bom = cl_abap_codepage=>convert_from( - source = lv_hex_bom + lv_xstring = cl_abap_char_utilities=>byte_order_mark_big. + lv_bom_big = cl_abap_codepage=>convert_from( + source = lv_xstring + codepage = 'UTF-16' ). + + lv_xstring = cl_abap_char_utilities=>byte_order_mark_little. + lv_bom_little = cl_abap_codepage=>convert_from( + source = lv_xstring codepage = 'UTF-16' ). * WRITE '@KERNEL console.dir(INPUT);'. @@ -65,7 +71,8 @@ CLASS kernel_call_transformation IMPLEMENTATION. WRITE '@KERNEL if (INPUT.sourceXML?.constructor.name === "ABAPObject") this.mi_doc.set(INPUT.sourceXML);'. WRITE '@KERNEL if (INPUT.sourceXML?.constructor.name === "String") lv_source.set(INPUT.sourceXML);'. IF lv_source IS NOT INITIAL. - IF lv_source(1) = '<' OR ( strlen( lv_source ) > 1 AND lv_source(1) = lv_str_bom AND lv_source+1(1) = '<' ). + IF lv_source(1) = '<' + OR ( strlen( lv_source ) > 1 AND ( lv_source(1) = lv_bom_big OR lv_source(1) = lv_bom_little ) AND lv_source+1(1) = '<' ). lv_type = 'XML'. parse_xml( lv_source ). ELSEIF lv_source(1) = '{' OR lv_source(1) = '['. diff --git a/src/kernel/call_transformation/kernel_call_transformation.clas.testclasses.abap b/src/kernel/call_transformation/kernel_call_transformation.clas.testclasses.abap index 03ff83a3..dd89481d 100644 --- a/src/kernel/call_transformation/kernel_call_transformation.clas.testclasses.abap +++ b/src/kernel/call_transformation/kernel_call_transformation.clas.testclasses.abap @@ -129,7 +129,8 @@ CLASS ltcl_call_transformation DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATI METHODS xml_to_xml FOR TESTING RAISING cx_static_check. METHODS xml_to_xml_rm_header FOR TESTING RAISING cx_static_check. METHODS xml_to_xml_rm_header_bom FOR TESTING RAISING cx_static_check. - METHODS byte_order_mark FOR TESTING RAISING cx_static_check. + METHODS byte_order_mark_big FOR TESTING RAISING cx_static_check. + METHODS byte_order_mark_little FOR TESTING RAISING cx_static_check. ENDCLASS. CLASS ltcl_call_transformation IMPLEMENTATION. @@ -1143,7 +1144,7 @@ CLASS ltcl_call_transformation IMPLEMENTATION. ENDMETHOD. - METHOD byte_order_mark. + METHOD byte_order_mark_big. DATA: BEGIN OF ls_data, foo TYPE i, @@ -1169,4 +1170,30 @@ CLASS ltcl_call_transformation IMPLEMENTATION. ENDMETHOD. + METHOD byte_order_mark_little. + + DATA: BEGIN OF ls_data, + foo TYPE i, + END OF ls_data. + DATA lv_xml TYPE string. + DATA lv_str_bom TYPE string. + DATA lv_hex_bom TYPE xstring. + + lv_hex_bom = cl_abap_char_utilities=>byte_order_mark_little. + lv_str_bom = cl_abap_codepage=>convert_from( + source = lv_hex_bom + codepage = 'UTF-16' ). + + lv_xml = |{ lv_str_bom }| && + || && + || && + ||. + + CALL TRANSFORMATION id + OPTIONS value_handling = 'accept_data_loss' + SOURCE XML lv_xml + RESULT repo = ls_data. + + ENDMETHOD. + ENDCLASS. \ No newline at end of file