在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”,这点在升级的时候要注意,要防止字串丢失。