关于4.6C升级到ECC UNICODE时全角字符串长度问题

      在ABAP中,我们计算字符串长度的时候,用到strlen()这个内部函数,[COMPUTE] n = STRLEN( str ).在4.6C环境下,系统为非UNICODE,用strlen()这个函数计算字符串长度时,如果包含全角字符,全角字符是作为两个字节计算的。但是,再ECC UNICODE系统下,用strlen()这个函数计算包含全角字符的字符串时,全角是按一个字节计算的。

      例如,str = '全角123',非UNICODE系统下,strlen( str ) = 7。而在UNICODE系统下,strlen( str ) = 5。所以在从非UNICODE系统升级到UNICODE系统时,要对strlen()这个函数进行替换:

 

*--- CHANGE START:

*  l_len = STRLEN( str ).

    CALL METHOD cl_scp_linebreak_util=>get_visual_stringlength
      EXPORTING
        im_string                = str
        im_langu                = sy-langu
      IMPORTING
        ex_pos_vis             = l_tmp
      EXCEPTIONS
        invalid_text_enviroment = 1
        OTHERS                  = 2.

 

    IF sy-subrc <> 0.
*  MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.


    l_len = l_tmp.
*--- CHANGE END:

 

      这样替换后的l_len就和原非UNICODE下的l_len就一致了。      

                                          

      在打印到屏幕上,使用 write: str+0(n) 时,全角字符也是我们需要考虑的。在UNICODE系统下,字符串偏移量计算,全角和半角都是按照一个字节计算的,但是打印到屏幕上时,全角又按照两个字节计算了。

例如: str = '全角123' ,UNICODE系统下,write: str+0(5),计算的长度是5,是“全角123”,但是打印到屏幕上时,输出的就是“全角1”,“23”就丢了。而在非UNICODE系统下,write: str+0(5),计算和输出的都是“全角1”,这点在升级的时候要注意,要防止字串丢失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值