博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
中文字符截取乱码问题
阅读量:5746 次
发布时间:2019-06-18

本文共 1830 字,大约阅读时间需要 6 分钟。

又是非Unicode老系统问题,当有中文时,截取就成问题,原因是中文占两字节,而英文只占一个字节,而在老R3系统中C类型只占一个字节。
思路:将字符统一转换成Unicode后截取
DATA: s TYPE string.
s = '1a的的的b1才才才饿饿饿d1是是是e1哦哦哦'.
WRITE:/ s .
WRITE:/ s+14(5)."直接取会出乱码!!
PERFORM frm_substring USING s s 14 5."从第15个字符开始取,取5个字符
WRITE: / s.
*&---------------------------------------------------------------------*
*&      Form  frm_substring
*&---------------------------------------------------------------------*
*       老R3(非Unicode系统)字符串截
*----------------------------------------------------------------------*
*      -->P_SRC  text  原字符串
*      -->P_SUB  text  截取后的字符串
*      -->P_off  text  起始索引(从0开始)
*      -->P_LEN  text  截取长度
*----------------------------------------------------------------------*
FORM frm_substring  USING    p_src
                             p_sub
                             p_off
                             p_len.
  DATA: xstr TYPE xstring.
  DATA:  l_codepage(4) TYPE n .
  DATA:  l_encoding(20).
  CALL FUNCTION 'SCP_CODEPAGE_BY_EXTERNAL_NAME'
    EXPORTING
      external_name = 'UTF-16BE'
    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 = p_src )."编码
  xstr =  convout->get_buffer( ).
  WRITE: / xstr."
  DATA:truc_str TYPE string,off TYPE i,len TYPE i.
  truc_str = xstr.
  off = p_off * 4.
  len = p_len * 4.
  truc_str = truc_str+off(len).
  WRITE / truc_str."截取获得的二进串
  DATA: rf_elem_typ TYPE REF TO cl_abap_elemdescr.
  DATA: rf_c TYPE REF TO data.
  FIELD-SYMBOLS: <fs_c> TYPE x .
  DATA: c_len TYPE i.
  c_len = 2 * p_len."Unicode字符,每个占2个字节
  rf_elem_typ ?= cl_abap_elemdescr=>get_c( c_len ).
  CREATE DATA rf_c TYPE HANDLE rf_elem_typ.
  ASSIGN rf_c->* TO <fs_c> CASTING.
  <fs_c> = truc_str.
  DATA: convin TYPE REF TO cl_abap_conv_in_ce.
  convin = cl_abap_conv_in_ce=>create( encoding = l_encoding input = <fs_c> ).
  DATA: str TYPE string.
  CALL METHOD convin->read"解码
    IMPORTING data = p_sub.
ENDFORM.                    " frm_substring

转载地址:http://vfazx.baihongyu.com/

你可能感兴趣的文章
【C语言】03-第一个C程序代码分析
查看>>
斐波那契数列 Php练手
查看>>
ArcGIS Server 10 for java 注册SOE出现的问题
查看>>
jquery ajax 不执行赋值,return没有返回值的解决方法
查看>>
与众不同 windows phone (48) - 8.0 其它: C# 调用 C++
查看>>
Zookeeper Tutorial 2 -- Programmer's Guide
查看>>
树形结构 DropDownList
查看>>
RapeLay(电车之狼R)的结局介绍 (隐藏结局攻略)
查看>>
Lua的function、closure和upvalue
查看>>
[转]学习C#:Attribute与Property
查看>>
Error opening zip file or JAR manifest missing : D:\play-1.2.5/framework/play-1.2.5.jar
查看>>
MySQL自定义查询字段排序
查看>>
JS思维之路菜鸟也能有大能量(1)--模拟push
查看>>
Imatest 崩溃
查看>>
领域驱动设计之单元测试最佳实践(二)
查看>>
Python实现C代码统计工具(三)
查看>>
CentOS下安装LAMP环境
查看>>
2015年最全的移动WEB前端UI框架
查看>>
[工具] 将Sublime Text 3配置为Java代码编辑器
查看>>
iOS开发UI篇—APP主流UI框架结构
查看>>