中文的简繁体转换

我目前的公司会同事使用简体和繁体,但是我们使用下面的这段代码实现简繁体转换的时候会编码已经从变化了,但是输出的文本却依旧是繁体,很奇怪,

*&---------------------------------------------------------------------*
*& 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.

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值