我目前的公司会同事使用简体和繁体,但是我们使用下面的这段代码实现简繁体转换的时候会编码已经从变化了,但是输出的文本却依旧是繁体,很奇怪,
*&---------------------------------------------------------------------*
*& Report ZCSN_TRANSLATE
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zcsn_translate.
DATA : xstr TYPE xstring .
DATA : l_codepage(4) TYPE n .
DATA : l_encoding(20).
********** 字符集名与内码转换
" 将外部字符集名转换为内部编码
DATA: lv_xstr(100) TYPE c.
lv_xstr = '國家'.
write: / '轉換前字符串:', lv_xstr.
DATA: lv_len TYPE i.
lv_len = strlen( lv_xstr ).
CALL FUNCTION 'SCP_CODEPAGE_BY_EXTERNAL_NAME'
EXPORTING
external_name = 'BIG5' "GBK BIG5 = 8300
IMPORTING
sap_codepage = l_codepage.
l_encoding = l_codepage .
********** 编码
DATA : convout TYPE REF TO cl_abap_conv_out_ce .
" 创建编码对象
convout = cl_abap_conv_out_ce=>create( encoding = l_encoding ).
convout->write( data = lv_xstr n = lv_len ). " 编码
xstr = convout->get_buffer( ). " 获取码流
WRITE: / '繁體編碼:', xstr . "E6B19FE6ADA3E5869B
DATA:
in_buffer TYPE xstring,
out_buffer TYPE xstring,
conv TYPE REF TO cl_abap_conv_x2x_ce.
in_buffer = xstr.
conv = cl_abap_conv_x2x_ce=>create(
in_encoding = '8300'
in_endian = 'L'
out_encoding = '8400'
out_endian = 'B'
input = in_buffer
).
call method conv->reset
exporting
input = in_buffer.
CALL METHOD conv->convert_c( n = 5 ).
*CALL METHOD conv->convert_i( ).
out_buffer = conv->get_out_buffer( ).
WRITE: / '簡體編碼:', out_buffer.
xstr = out_buffer.
********** 解码
CALL FUNCTION 'SCP_CODEPAGE_BY_EXTERNAL_NAME'
EXPORTING
external_name = 'GBK' "GBK=8400 GB2312=8450
IMPORTING
sap_codepage = l_codepage.
l_encoding = l_codepage .
DATA : convin TYPE REF TO cl_abap_conv_in_ce .
" 创建解码对象
*convin = cl_abap_conv_in_ce=>create( encoding = l_encoding input = xstr ).
convin = cl_abap_conv_in_ce=>create( encoding = l_encoding ).
DATA : str TYPE string .
*CALL METHOD convin->read " 解码
* IMPORTING data = str .
convin->convert(
EXPORTING input = xstr
IMPORTING data = str ).
write: / '轉換后字符串:', str . "
然后我们写了一个稍微笨一点的方法,将会用到的简繁体全部存放到内表中,简体和繁体存放的位置相互对应。
(下面代码因设计的透明表结构而异)
DATA: lv_zf TYPE string,
lv_zh TYPE string,
lv_chr TYPE string,
lv_pattern TYPE string.
DATA: lv_len TYPE i,
lv_index TYPE i.
DATA: lv_zfname TYPE string,
lv_zhname TYPE string.
DATA: lt_table TYPE STANDARD TABLE OF yachineseconvert.
DATA: ls_table TYPE yachineseconvert.
FIELD-SYMBOLS:<as_is> TYPE string,
<to_be> TYPE string.
IF iv_string IS INITIAL.
rv_string = space.
ELSE.
SELECT * INTO TABLE lt_table
FROM YACHINESECONVERT.
LOOP AT lt_table INTO ls_table.
CONCATENATE
lv_zh ls_table-zh_name
INTO lv_zh.
CONCATENATE
lv_zf ls_table-zf_name
INTO lv_zf.
ENDLOOP.
CONDENSE lv_zh no-gaps.
CONDENSE lv_zf no-gaps.
ASSIGN lv_zf TO <as_is> .
ASSIGN lv_zh TO <to_be> .
lv_len = STRLEN( iv_string ).
DO lv_len TIMES.
lv_index = sy-index - 1.
lv_chr = iv_string+lv_index(1).
clear lv_index.
FIND lv_chr IN <as_is> MATCH OFFSET lv_index.
IF lv_index = 0.
CONCATENATE rv_string lv_chr INTO rv_string.
ELSE.
lv_chr = <to_be>+lv_index(1).
CONCATENATE rv_string lv_chr INTO rv_string.
ENDIF.
ENDDO.
ENDIF.