ABAP--关于Unicode的常见错误和解决方法

    技术2024-12-06  16

    原文地址: http://blog.csdn.net/CompassButton/archive/2010/10/12/5935088.aspx

     

    最近也碰到一些Unicode的问题, 转贴备查.

    Unicode

    Unicode is the international character encoding standard that allows the systems to handle text data from multiple languages simultaneously and consistently. In fact, more than 5,000 SAP customer installations are already purely Unicode-based, and the relative share of pure Unicode installations is growing rapidly. Many companies are adopting Web services to gain benefits such as greater openness that extends processes to customers and business partners. Service-oriented architectures (SOAs), including SAP's Enterprise Services Architecture,rely on a set of standards that enable global interoperability across systems, programming languages, and application services. One of these required standards is Unicode.Much of the enterprise software out there is already completely Unicode-ready.Everything in the Java space and everything based on XML is Unicode by definition.New system installations will have to be Unicode only in future releases and new SAP products will only be offered in Unicode.In fact, SAP NetWeaver Portal and SAP NetWeaver Exchange Infrastructure (XI) are already Unicode-only.Each character has a unique number („Unicode code point") Notation U+nnnn (where nnnn are hexadecimal digits) See http://www.unicode.org for complete code charts

     

    Note: Unicode flag ( "Unicode checks active") is used as a Program Attribute to control the Unicode enabling procedure

    A program without Unicode flag is NOT executable on a Unicode system. Transaction UCCHECK can be used as tool to analyze customer coding for unicode errors.

     

    Common Unicode Errors and Their Corrections:

    1. Error regarding OPEN DATASET:  Before Unicode:    OPEN DATASET P_UNIX FOR OUTPUT IN TEXT MODE.  Resolution:  OPEN DATASET P_UNIX FOR OUTPUT IN TEXT MODE ENCODING NON-UNICODE.  OR  OPEN DATASET P_UNIX FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.  OR  OPEN DATASET P_UNIX FOR OUTPUT IN LEGACY TEXT MODE.   The choice of resolution depends on the kind of data the file contains. The addition ENCODING defines how the characters are represented in the text file. When writing to a text file, the content of a data object is converted to the representation entered after ENCODING, and transferred to the file. The same rule is followed for reading files using the OPEN DATASET command.    Before Unicode:  OPEN DATASET P_UNIX FOR OUTPUT IN BINARY MODE.  Resolution:  OPEN DATASET P_UNIX FOR OUTPUT IN LEGACY BINARY MODE. Note: Some time it is possible that mode has not been specified in old system, then by default system will take it as BINARY mode, We should add LEGACY BINARY mode for such syntax.

    2. Error regarding WS_UPLOAD/WS_DOWNLOAD.  Before Unicode:   Parameters: filename (128) lower case.  CALL FUNCTION 'WS_UPLOAD'  EXPORTING  FILENAME      = filename  FILETYPE      = 'DAT'  TABLES  DATA_TAB      = I_INREC  EXCEPTIONS  FILE_OPEN_ERROR            = 1  FILE_READ_ERROR            = 2  CONVERSION_ERROR        = 3  INVALID_TABLE_WIDTH    = 4  INVALID_TYPE               = 5  NO_BATCH                   = 6  UNKNOWN_ERROR              = 7.    Resolution:  Data:w_filename TYPE STRING.  Field-symbols:  <fs_filename> type any.  Assign filename to <fs_filename>.  Move <fs_filename> to w_filename.    CALL FUNCTION 'GUI_UPLOAD'  EXPORTING  FILENAME = w_filename  FILETYPE = 'DAT'  TABLES  DATA_TAB = I_INREC  EXCEPTIONS  FILE_OPEN_ERROR = 1  FILE_READ_ERROR = 2  NO_BATCH        = 3  GUI_REFUSE_FILETRANSFER = 4  INVALID_TYPE            = 5  NO_AUTHORITY            = 6  UNKNOWN_ERROR           = 7  BAD_DATA_FORMAT         = 8  HEADER_NOT_ALLOWED      = 9  SEPARATOR_NOT_ALLOWED   = 10  HEADER_TOO_LONG         = 11  UNKNOWN_DP_ERROR        = 12  ACCESS_DENIED           = 13  DP_OUT_OF_MEMORY        = 14  DISK_FULL               = 15  DP_TIMEOUT              = 16  OTHERS                  = 17. The Function Modules WS_UPLOAD / WS_DOWNLOAD is obsolete and hence need to be replaced by their new counterparts' viz. GUI_UPLOAD / GUI_DOWNLOAD. 3.Error regarding UPLOAD / DOWNLOAD:  Before Unicode:  DATA: V_FILENAME TYPE STRING value 'c: /test.txt'.  CALL FUNCTION 'DOWNLOAD'  EXPORTING  FILENAME = 'c: /test.txt'  FILETYPE = 'ASC'  TABLES  DATA_TAB  = CO_TAB  EXCEPTIONS  INVALID_FILESIZE     = 01  INVALID_TABLE_WIDTH  = 02  INVALID_TYPE       = 03  NO_BATCH             = 04  UNKNOWN_ERROR        = 05.    Resolution:  data: filename TYPE string.  data: ftab type filetable.  data: wa_ftab TYPE LINE OF filetable.  data: r_code type sy-subrc.  move 'c: /test.txt'  to filename .  If filename CA '.'.  Else.  CONCATENATE filename '*' into filename.  endif.  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG                   EXPORTING  DEFAULT_FILENAME   = filename  CHANGING  FILE_TABLE         = ftab  RC                 = r_code.  IF NOT ftab[] IS INITIAL.  read table ftab into wa_ftab index 1.  move wa_ftab-filename to filename.  CALL FUNCTION 'GUI_DOWNLOAD'  EXPORTING  FILENAME = filename  FILETYPE = 'ASC'  TABLES  DATA_TAB = CO_TAB  EXCEPTIONS  FILE_WRITE_ERROR          = 1  NO_BATCH                  = 2  GUI_REFUSE_FILETRANSFER   = 3  INVALID_TYPE              = 4  NO_AUTHORITY              = 5  UNKNOWN_ERROR             = 6  HEADER_NOT_ALLOWED        = 7  SEPARATOR_NOT_ALLOWED     = 8  FILESIZE_NOT_ALLOWED      = 9  HEADER_TOO_LONG           = 10  DP_ERROR_CREATE           = 11  DP_ERROR_SEND             = 12  DP_ERROR_WRITE            = 13  UNKNOWN_DP_ERROR          = 14  ACCESS_DENIED             = 15  DP_OUT_OF_MEMORY          = 16  DISK_FULL                 = 17  DP_TIMEOUT                = 18  FILE_NOT_FOUND            = 19  DATAPROVIDER_EXCEPTION    = 20  CONTROL_FLUSH_ERROR       = 21  OTHERS                    = 22.  Endif.   The Function Modules UPLOAD / DOWNLOAD is obsolete and hence need to be replaced by their new replacements  GUI_UPLOAD / GUI_DOWNLOAD. Along with their counterparts, we need to add the Function Module of F4_Filename to read the filename at runtime.   4.Error regarding WS_EXECUTE    Before Unicode:    CALL FUNCTION 'WS_EXECUTE'    EXPORTING    DOCUMENT                    = 'SAP SERVICE MARKETPLACE'    EXCEPTIONS    FRONTEND_ERROR      = 1    NO_BATCH                    = 2    PROG_NOT_FOUND      = 3    ILLEGAL_OPTION          = 4    OTHERS                         = 5.   Resolution:   CALL METHOD CL_GUI_FRONTEND_SERVICES=>EXECUTE   EXPORTING   DOCUMENT   = 'https: //websmp206.sap-ag.de/'   DEFAULT_DIRECTORY  = 'SAP SERVICE MARKETPLACE'   EXCEPTIONS   CNTL_ERROR                    = 1   ERROR_NO_GUI                  = 2   BAD_PARAMETER                 = 3   FILE_NOT_FOUND                = 4   PATH_NOT_FOUND                = 5   FILE_EXTENSION_UNKNOWN        = 6   ERROR_EXECUTE_FAILED          = 7   SYNCHRONOUS_FAILED            = 8   NOT_SUPPORTED_BY_GUI          = 9   Others                        = 10.

    5. Converting the hex characters to strings.  CONSTANTS: c_hex (2) TYPE x VALUE '000A'.  DATA:   LV_TMP TYPE C.   TRY.   CALL METHOD CL_ABAP_CONV_IN_CE=>UCCP   EXPORTING   UCCP   = c_hex   RECEIVING   CHAR   = LV_TMP   .   CATCH CX_SY_CONVERSION_CODEPAGE.   CATCH CX_PARAMETER_INVALID_TYPE.   CATCH CX_SY_CODEPAGE_CONVERTER_INIT.   ENDTRY.  Note that the hex variable should be of output length 2 for the conversion to take place.   6. Moving contents from one structure to another  Before Unicode:      SRTFDLOM = XSRTFDLOM.  Resolution:   CLASS CL_ABAP_CONTAINER_UTILITIES DEFINITION LOAD.  DATA: LV_TAB(1000) TYPE C.  CALL METHOD CL_ABAP_CONTAINER_UTILITIES=>FILL_CONTAINER_C  EXPORTING  IM_VALUE                = XSRTFDLOM  IMPORTING  EX_CONTAINER            = LV_TAB    CALL METHOD  CL_ABAP_CONTAINER_UTILITIES=>READ_CONTAINER_C  EXPORTING  IM_CONTAINER       = LV_TAB  IMPORTING  EX_VALUE                = SRTFDLOM.    OR Before Unicode:  wa_test = upload.

     Resolution:  data:    cbin  TYPE REF TO cl_abap_conv_out_ce,                     buffer  TYPE xstring,                     conv  TYPE REF TO cl_abap_conv_in_ce,                     view1  TYPE REF TO cl_abap_view_offlen,                     view2  TYPE REF TO cl_abap_view_offlen,                     view  TYPE REF TO cl_abap_view_offlen.     cbin  = cl_abap_conv_out_ce=>create(  ).     view1  = cl_abap_view_offlen=>create_legacy_view( upload ).     conv  = cl_abap_conv_in_ce=>create(  ).     iew2  = cl_abap_view_offlen=>create_legacy_view( wa_test ).     Try .        cbin->convert_struc( EXPORTING data = upload view = view1                       IMPORTING buffer = buffer).      conv->convert_struc( EXPORTING input = buffer view = view2                       IMPORTING data = wa_test ).               CATCH CX_SY_CODEPAGE_CONVERTER_INIT .        CATCH CX_SY_CONVERSION_CODEPAGE .        CATCH CX_PARAMETER_INVALID_TYPE .        CATCH CX_PARAMETER_INVALID_RANGE .     ENDTRY .  Note that in the above resolution FILL_CONTAINER_C can be used to convert contents of a structure to string/character array and READ_CONTAINER_C can be used to move the contents of a string to a structure. Also the convert class methods can be used in a similar fashion by creating shown below:     Before Unicode: (from structure to string)           string = wa_structure.     Resolution:          data:  cbout  TYPE REF TO cl_abap_conv_out_ce,             convt  TYPE REF TO cl_abap_conv_in_ce,             buffer  TYPE xstring,             view1  TYPE REF TO cl_abap_view_offlen,             view2  TYPE REF TO cl_abap_view_offlen,             view  TYPE REF TO cl_abap_view_offlen.          data: begin of t_out,          output(1000) type c,          end of t_out .          cbout = cl_abap_conv_out_ce =>create( ).          view1 = cl_abap_view_offlen =>create_legacy_view( wa_structure ).          convt = cl_abap_conv_in_ce =>create( ).          view2 = cl_abap_view_offlen =>create_legacy_view( t_out ).         TRY. cbout->convert_struc( EXPORTING data = wa_structure view = view1                IMPORTING buffer  = buffer). convt->convert_struc(  EXPORTING input  = buffer  view = view2                 IMPORTING data  = t_out ).            CATCH CX_SY_CODEPAGE_CONVERTER_INIT .            CATCH CX_SY_CONVERSION_CODEPAGE .            CATCH CX_PARAMETER_INVALID_TYPE .            CATCH CX_PARAMETER_INVALID_RANGE .         ENDTRY.     string = t_out-output .  Before Unicode: (from string to structure)  wa_structure = string.  Resolution:         data :  cbout TYPE REF TO cl_abap_conv_out_ce,            convt TYPE REF TO cl_abap_conv_in_ce,            buffer TYPE xstring,            view1 TYPE REF TO cl_abap_view_offlen,            view2 TYPE REF TO cl_abap_view_offlen,            view   TYPE REF TO cl_abap_view_offlen .         data:  begin of t_out,            output(1000) type c,            end of t_out .         t_out-output = string.         cbout = cl_abap_conv_out_ce=>create( ).         view1 = cl_abap_view_offlen=>create_legacy_view( t_out ).         convt = cl_abap_conv_in_ce=>create( ).         view2 = cl_abap_view_offlen=>create_legacy_view( wa_structure ).          TRY.          cbout->convert_struc( EXPORTING data = t_out view = view1                              IMPORTING buffer = buffer ).          convt->convert_struc( EXPORTING input = buffer view = view2                IMPORTING data = wa_structure ).            CATCH CX_SY_CODEPAGE_CONVERTER_INIT .          CATCH CX_SY_CONVERSION_CODEPAGE .          CATCH CX_PARAMETER_INVALID_TYPE .          CATCH CX_PARAMETER_INVALID_RANGE .          ENDTRY.   7. Split command using TAB character Error:     Before Unicode:     data: separator type x value '09'.     data: str type string.    Split str at separator.        Resolution:   Split str at CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB.           Note that this works only in case of hex value 0009.     8. Error regarding the FORM AUTHORITY_BEGIN (RSAQEXCE)  Before Unicode:  PERFORM AUTHORITY_BEGIN (RSAQEXCE).  PERFORM AUTHORITY (RSAQEXCE) USING 'PLKO'.  PERFORM AUTHORITY (RSAQEXCE) USING 'PLAS'.  PERFORM AUTHORITY(RSAQEXCE) USING 'PLWP'.  PERFORM AUTHORITY(RSAQEXCE) USING 'PLPH'.  PERFORM AUTHORITY(RSAQEXCE) USING 'PLPO'.  PERFORM AUTHORITY_END (RSAQEXCE).  Resolution:  PERFORM AUTHORITY_BEGIN(RSAQEXCE) using   'CL_QUERY_TAB_ACCESS_AUTHORITY'.  PERFORM AUTHORITY(RSAQEXCE) USING 'PLKO'  'CL_QUERY_TAB_ACCESS_AUTHORITY'.     PERFORM AUTHORITY(RSAQEXCE) USING 'PLAS'  'CL_QUERY_TAB_ACCESS_AUTHORITY'.  PERFORM AUTHORITY(RSAQEXCE) USING 'PLWP'  'CL_QUERY_TAB_ACCESS_AUTHORITY'.  PERFORM AUTHORITY(RSAQEXCE) USING 'PLPH'  'CL_QUERY_TAB_ACCESS_AUTHORITY'.  PERFORM AUTHORITY(RSAQEXCE) USING 'PLPO'  'CL_QUERY_TAB_ACCESS_AUTHORITY'.  PERFORM AUTHORITY_END(RSAQEXCE) using   'CL_QUERY_TAB_ACCESS_AUTHORITY'.

    This is because the FORM AUTHORITY_BEGIN (RSAQEXCE) has 2 parameters from ECC 6.0 onwards.   9. A Cancel option required in GUI_UPLOAD/GUI_DOWNLOAD Function Module:  Before Unicode:    CALL FUNCTION 'UPLOAD'    EXPORTING      FILENAME    = d:/Z400.txt      FILETYPE    = 'ASC'   IMPORTING      FILESIZE    = l_filesize      CANCEL      = cancel      ACT_FILENAME = l_filename      ACT_FILETYPE = l_filetype    TABLES      DATA_TAB     = itab   EXCEPTIONS     CONVERSION_ERROR     = 1     INVALID_TABLE_WIDTH  = 2     INVALID_TYPE         = 3     NO_BATCH             = 4     UNKNOWN_ERROR        = 5     GUI_REFUSE_FILETRANSFER   = 6     OTHERS                    = 7.  Resolution:   CLASS cl_gui_frontend_services DEFINITION LOAD.  DATA: v_title   TYPE string,        v_fullpath  TYPE string,        filename   TYPE string,        v_path     TYPE string,        v_user_action  TYPE i,        v_encoding TYPE abap_encoding.

     MOVE: sy-repid TO v_title.  CALL METHOD cl_gui_frontend_services=>file_save_dialog  EXPORTING  window_title                = v_title   with_encoding          = 'X'   default_file_name      = filename   CHANGING          filename               = filename   path                   = v_path   fullpath               = v_fullpath   user_action            = v_user_action   file_encoding          = v_encoding   EXCEPTIONS          cntl_error             = 1   error_no_gui           = 2   not_supported_by_gui  = 3          OTHERS                 = 4.   IF sy-subrc <> 0. EXIT. ENDIF.

    IF v_user_action <> cl_gui_frontend_services=>action_ok.    EXIT. ENDIF.

    CALL FUNCTION 'GUI_DOWNLOAD' EXPORTING filename                         = filename  TABLES data_tab                         = itab  EXCEPTIONS         file_write_error               = 1  no_batch                        = 2  gui_refuse_filetransfer     = 3  invalid_type                    = 4  no_authority                   = 5  unknown_error                = 6  header_not_allowed         = 7  separator_not_allowed     = 8  filesize_not_allowed        = 9  header_too_long              = 10  dp_error_create               = 11         dp_error_send                 = 12  dp_error_write                 = 13  unknown_dp_error          = 14  access_denied                = 15  dp_out_of_memory         = 16  disk_full                    = 17  dp_timeout                      = 18  file_not_found                 = 19  dataprovider_exception   = 20  control_flush_error          = 21  OTHERS                         = 22.   10. Error regarding Do...Varying clause.  Before Unicode:  DATA: BEGIN OF I_0041_DATE OCCURS 0,        DAR     LIKE PA0041-DAR01,        DAT     LIKE PA0041-DAT01,        END   OF I_0041_DATE.   DO 12 TIMES VARYING I_0041_DATE FROM P0041-DAR01 NEXT P0041-DAR02.  Resolution:   DATA: BEGIN OF I_0041_DATE OCCURS 0,             DAR     LIKE PA0041-DAR01,             DAT     LIKE PA0041-DAT01,             END   OF I_0041_DATE.   DO 10 TIMES VARYING I_0041_DATE-dar FROM P0041-DAR01 NEXT P0041-DAR02  VARYING I_0041_DATE-dat FROM P0041-DAt01 NEXT P0041-DAt02.    Before Unicode:    DO VARYING ZW_FIELD FROM ZW_FIELD_LINE-F01+1 NEXT ZW_FIELD_LINE-F01+1(1).    Resolution:    DO VARYING ZW_FIELD FROM ZW_FIELD_LINE-F01+1 NEXT ZW_FIELD_LINE-F02+1(1) RANGE ZW_FIELD_LINE-F01.   11. Error regarding the Describe commands    Before Unicode:                         Describe field text length len.    Resolution:                          Describe field text length len in Character Mode.        12. Error regarding the Function Module POPUP_WITH_TABLE_DISPLAY.  Before Unicode:  POPUP_WITH_TABLE_DISPLAY    Resolution:  POPUP_WITH_TABLE_DISPLAY_OK   13. Error regarding hexadecimal variable comparison  Before Unicode:  data:  xf1 type x,         xf2 type x,         xf3 type x.  Concatenate xf1 xf2 to xf3.  If xf1 CS xf3...  Resolution:  data:  xf1 type x,         xf2 type x,         xf3 type x.  Concatenate xf1 xf2 to xf3 in byte mode.  If xf1 BYTE-CS xf3...   14. Problems regarding Assignment between Structures     Conversion using includes with group names                       Before Unicode:                      TYPES: BEGIN OF T_STRUC,                       F1 TYPE C,                       F2 TYPE C,                       F3 TYPE I,                       F4 TYPE P,            END OF T_STRUC.              DATA: BEGIN OF STRUC1.            INCLUDE TYPE T_STRUC.            DATA: F5 TYPE X.            DATA: END OF STRUC1.            DATA: BEGIN OF STRUC2.            INCLUDE TYPE T_STRUC.              DATA: F6 TYPE P.            DATA: END OF STRUC2.            STRUC1 = STRUC2.  (Unicode error)   In this case, it was assumed that only the content of the includes is to be assigned - that is the components F1 to F4. Until now, it was tolerated that the component F5 is overwritten with a meaningless value.              Resolution:                        TYPES: BEGIN OF T_STRUC,                       F1 TYPE C,                       F2 TYPE C,                       F3 TYPE I,                       F4 TYPE P,                      END OF T_STRUC.                        DATA: BEGIN OF STRUC1.            INCLUDE TYPE T_STRUC AS PART1.            DATA: F5 TYPE X.                      DATA: END OF STRUC1.                      DATA: BEGIN OF STRUC2.            INCLUDE TYPE T_STRUC AS PART1.            DATA: F6 TYPE P.                      DATA: END OF STRUC2.                        STRUC1-PART1 = STRUC2-PART1.      Conversion Using Offset-Based or Length-Based Accesses              Before Unicode:                        DATA: BEGIN OF STRUC1,                      F1(10) TYPE C,                      F2(20) TYPE C,                      F3 TYPE I,                      F4 TYPE P,                      END OF STRUC1,                        BEGIN OF STRUC2,                      C1(10) TYPE C,                      C2(20) TYPE C,                      C3 TYPE X,                      C4 TYPE F,                      END OF STRUC2.                        STRUC1 = STRUC2  (Unicode Error)   In this example, it is assumed that only the content of the first two components C1 and C2 is to be passed to F1 and F2, because the following components F3 and F4 are overwritten by meaningless values.    Resolution    DATA: BEGIN OF STRUC1,  F1 (10) TYPE C,  F2 (20) TYPE C,  F3 TYPE I,  F4 TYPE P,  END OF STRUC1,    BEGIN OF STRUC2,  C1 (10) TYPE C,  C2 (20) TYPE C,  C3 TYPE X,  C4 TYPE F,  END OF STRUC2  STRUC1 (30) = STRUC2 (30).   Since the initial part of the structures relevant for the assignment is purely character-type, the operands of the assignment can be selected using offset-based or length-based accesses. Assignment between Structure and Single Field of Type N              Before Unicode                     DATA: BEGIN OF STRUC,                               NUMBER(20) TYPE N,                               F2 TYPE P,                               END OF STRUC,                               NUMBER(20) TYPE N.                               NUMBER = STRUC.  Unicode error   Assignments between a non-character-type structure and a single field of type N are no longer allowed in Unicode programs              Resolution:                      DATA: BEGIN OF STRUC,                           NUMBER(20) TYPE N,                           F2 TYPE P,                           END OF STRUC,                           NUMBER(20) TYPE N.                   NUMBER = STRUC-NUMBER.  Since the first component of the structure is to be assigned to the single field, the code segment can be converted easily by replacing the assignment of the whole structure with an assignment of the first structure component.  Assignment and Single Field of Type between Structure D        Before Unicode            DATA: BEGIN OF STRUC,              YEAR (4) TYPE N,            MONTH(2) TYPE N,            DAY(2) TYPE N,            F4 TYPE P,            END OF STRUC,            DATE TYPE D.            DATE = STRUC. (Unicode error)   Assignments between a non-character-type structure and a single field of type D are no longer allowed in Unicode programs.         Resolution:                DATA: BEGIN OF STRUC,                        YEAR(4) TYPE N,                        MONTH(2) TYPE N,                        DAY(2) TYPE N,                        F4 TYPE P,                       END OF STRUC,                       DATE TYPE D.                         DATE = STRUC (8).    An offset-based or length-based access to the character-type initial part of the structure enables you to convert the problematic code segment to a Unicode-enabled code.

    Source site:https://wiki.sdn.sap.com/wiki/display/Snippets/Common+unicode+errors+and+solutions

    最新回复(0)