abap 中对于字符串长度的计算一般用 strlen 函数实现。但此函数只能算出字符的个数无法计算字符串的长度,例如 'ABC你好'用此函数计算得到的值为5,显然它不是我们想要的,它的字节长度为7 。
经过研究,我写了一个函数可以实现功能代码如下:
FUNCTION YGET_CNCHAR_CHARLE.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" REFERENCE(STRING) TYPE STRING 传入字符串
*" EXPORTING
*" REFERENCE(STR) TYPE STRING 返回字符串
*" REFERENCE(CHARLEN) TYPE I 返回长度
*"----------------------------------------------------------------------
DATA: w_uccp TYPE i,
w_temp(2) TYPE c,
w_left(100) TYPE c,
w_len(10) TYPE c,
s_len TYPE i
.
w_left = string.
DATA : BEGIN OF line,
text TYPE c,
END OF line,
itab LIKE TABLE OF line WITH HEADER LINE.
*DATA str TYPE string.
DO.
CALL FUNCTION 'TEXT_SPLIT'
EXPORTING
length = 2
text = w_left
IMPORTING
line = w_temp
rest = w_left.
CALL METHOD cl_abap_conv_out_ce=>uccpi
EXPORTING
char = w_temp
RECEIVING
uccp = w_uccp.
w_len = STRLEN( w_temp ).
* WRITE: /1 w_temp,
* 10 w_uccp,
* 25 w_len.
IF w_uccp > 256.
CONCATENATE str w_temp INTO str.
ENDIF.
IF w_left IS INITIAL OR sy-index > 100.
EXIT.
ENDIF.
ENDDO.
IF str IS NOT INITIAL.
DATA:t_len TYPE i.
clear : s_len,charlen.
t_len = STRLEN( string ).
s_len = STRLEN( str ).
t_len = t_len - s_len .
s_len = s_len * 2 .
charlen = t_len + s_len.
* WRITE :/,'CHARLEN=' ,charlen, 'STR= ',str.
ENDIF.
ENDFUNCTION.
先解释一下什么是自动按位切割字符串 ,例如: c1(10) type c value '123,,你好'. c2(9) type c .
将 c2 = c1 .此时由于c1中最后一字符是中文占两个字节,那么c2中得到的数据将会是 c2 = '123,,你> ' <-----------出现了乱码。
为了解决这个问题,我写了一个函数如果最后一位是两个字节而被赋值得变量是只剩一个字节空间时,放弃最后一个字符。
例如:
CALL FUNCTION 'YGET_TEXT_SPLIT'
EXPORTING
input = c1
IMPORTING
output = c2.
调用后c2的值为:c2 = '123,,你' <-----------不会出现了乱码
函数代码如下:
FUNCTION yget_text_split.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" REFERENCE(INPUT) TYPE C
*" REFERENCE(LENGTH) TYPE I OPTIONAL
*" EXPORTING
*" REFERENCE(OUTPUT) TYPE C
*" REFERENCE(RIGHT) TYPE C
*"----------------------------------------------------------------------
DATA len TYPE i.
IF input IS INITIAL.
RETURN.
ENDIF.
IF length IS INITIAL.
DESCRIBE FIELD output OUTPUT-LENGTH len .
* len = STRLEN( output ).
* CLEAR output.
ELSE.
len = length.
ENDIF.
CALL FUNCTION 'TEXT_SPLIT'
EXPORTING
length = len
text = input
IMPORTING
line = output
rest = right.
ENDFUNCTION.