系统是老R3,非Unicdoe系统,某些表字段是从外界系统过来的,由于接口设计的固定长度,外界系统传超长字符串过来后,就可能从最后一个中文字符中间截断,这问题到还没什么,只不过显示时最后一个字符显示成乱码而已,但是,如果将这些表字段捞出来与其它分隔符(如竖线) CONCATENATE时,可能会将这个分隔符吃掉,导致这些数据抛到对方系统后,无法再分隔,还原成一个个字段

如下面运行过程中:c3本身是一个字后面跟半个中文字符,当使用 竖线分隔符与0字符CONCATENATE后,发现竖线没有了,它与前面的?问号(注:不是真正的问号,而是由于编码B5在GBK字符集里找不到,ABAP编辑器以问号显示而已)合成  字了,即竖线被前面的半个汉字编码给吃掉了:

下面是经过frm_trunct_last 方法将半个中文字符截断后,再CONCATENATE拼接时,分隔符竖线就不会被吃掉了:


DATA: str TYPE string.
DATA: x3(3) TYPE x.
DATA: c3(3) TYPE c.
FIELD-SYMBOLS:<c3> TYPE x.
START-OF-SELECTION.
  ASSIGN c3 TO <c3> CASTING.
  "CBBE为“司”的编码,B5为前半个汉字编码,如“祙、单”等字的前半个就是B5
  <c3>  = 'CBBEB5'."模拟半个中文
  WRITE:/ c3.
  str = c3.
  CONCATENATE str `0` INTO str SEPARATED BY `|`.
  WRITE:/ str.
  str = c3.
  PERFORM frm_trunct_last USING str .
  CONCATENATE str `0` INTO str SEPARATED BY `|`.
  WRITE:/ str.
*&---------------------------------------------------------------------*
*&      Form  frm_trunct_last
*&---------------------------------------------------------------------*
*       如果字符串最后一个是半个字符,则截掉
*----------------------------------------------------------------------*
*      -->STR        如果不会吃字符,则返回原字符串
*----------------------------------------------------------------------*
FORM frm_trunct_last USING str TYPE string .
  DATA: xstr TYPE xstring.
  DATA: l_codepage(4) TYPE n .
  DATA: l_encoding(20).
  DATA: truc_str TYPE string.
  DATA: off_index TYPE i.
  DATA: trunct_str TYPE string.
  DATA: last_char TYPE string.
  DATA: last_char_code TYPE xstring.
  DATA: len TYPE i.
  DATA: x7f TYPE x VALUE '7F'.
  DATA: convout TYPE REF TO cl_abap_conv_out_ce.
  DATA: convin TYPE REF TO cl_abap_conv_in_ce.
  CALL FUNCTION 'SCP_CODEPAGE_BY_EXTERNAL_NAME'
    EXPORTING
      external_name = 'UTF-16BE'
    IMPORTING
      sap_codepage  = l_codepage.
  l_encoding = l_codepage.
  convout = cl_abap_conv_out_ce=>create( encoding = l_encoding ).
  convout->write( data = str ).
  xstr =  convout->get_buffer( ).
  truc_str = xstr.
  len = STRLEN( truc_str ).
  len = len / 4 .
  off_index = 4 * ( len - 1 ).
  xstr = truc_str+0(off_index).
  convin = cl_abap_conv_in_ce=>create( encoding = l_encoding input = xstr ).
  CALL METHOD convin->read
    IMPORTING
      data = trunct_str.
  off_index = 4 * ( len - 1 ).
  xstr = truc_str+off_index(4).
  convin = cl_abap_conv_in_ce=>create( encoding = l_encoding input = xstr ).
  CALL METHOD convin->read
    IMPORTING
      data = last_char.
  CALL FUNCTION 'SCP_CODEPAGE_BY_EXTERNAL_NAME'
    EXPORTING
      external_name = 'GBK'
    IMPORTING
      sap_codepage  = l_codepage.
  l_encoding = l_codepage.
  convout = cl_abap_conv_out_ce=>create( encoding = l_encoding ).
  convout->write( data = last_char ).
  last_char_code =  convout->get_buffer( ).
  len = XSTRLEN( last_char_code ).
  IF len = 1 AND last_char_code > x7f.
    str = trunct_str.
  ENDIF.
ENDFORM.                    "frm_trunct_last

注:分隔符是否被吃掉了,在屏幕输出上是看不出来的,如下面是输出结果:
 但从上面的调试过程可以看出是被吃掉了,经测试传到其他系统后,也是会被吃掉的

 

ABAP非Unicode系统中字符串拼接(CONCATENATE)时吃字符问题的更多相关文章

  1. cocosbuilder中使用字体描边时,字符重叠,间距过小问题

    cocosbuilder中使用字体描边时,字符重叠,间距过小问题 cocos2d-x 3.7 v3.7解析cocosbuilder中描边字体的代码如下: void LabelTTFLoader::pa ...

  2. SQL中字符串拼接

    1. 概述 在SQL语句中经常需要进行字符串拼接,以sqlserver,oracle,mysql三种数据库为例,因为这三种数据库具有代表性. sqlserver: select '123'+'456' ...

  3. Python中字符串拼接的三种方式

    在Python中,我们经常会遇到字符串的拼接问题,在这里我总结了三种字符串的拼接方式:     1.使用加号(+)号进行拼接 加号(+)号拼接是我第一次学习Python常用的方法,我们只需要把我们要加 ...

  4. javascript中字符串拼接详解

    字符串拼接是所有程序设计语言都需要的操作.当拼接结果较长时,如何保证效率就成为一个很重要的问题.本文介绍的是Javascript中的字符串拼接,希望对你有帮助,一起来看.   最近在研究<jav ...

  5. Python中字符串拼接的N种方法

    python拼接字符串一般有以下几种方法: ①直接通过(+)操作符拼接 s = 'Hello'+' '+'World'+'!'print(s) 输出结果:Hello World! 使用这种方式进行字符 ...

  6. CTE 中字符串拼接

    1>cte语法 1.1>基础语句和递归语句中必须有字段 1.2>最后只能跟一条查询语句 1.3>字符串拼接,要将拼接的字段转成字符串类型,cast(fieldName as n ...

  7. Java 8中字符串拼接新姿势:StringJoiner

    介绍 StringJoiner是java.util包中的一个类,用于构造一个由分隔符分隔的字符序列(可选),并且可以从提供的前缀开始并以提供的后缀结尾.虽然这也可以在StringBuilder类的帮助 ...

  8. 字符串拼接data-id时注意事项

    今天测试下一个ajax请求,结果后台接收不到data-id的数据,导致后台无法进行正确的数据库查询. 我的评论页面是使用字符串拼接后,再放到页面里的,其中有关data-id的部分是这样的: '< ...

  9. ubuntu下仅仅获取网卡一的ip地址 && shell中字符串拼接

    问题描述: ubuntu下仅仅获取网卡一的ip地址 问题背景: eth0,eth1,eth2……代表网卡一,网卡二,网卡三…… lo代表127.0.0.1,即localhost | 问题描述: 已知字 ...

随机推荐

  1. FastJson 数组、List、Set、Map基本序列化与日期格式化

    摘要: FastJson可以直接序列化数组.List.Set.Map等,也可以直接支持日期类型数据的格式化,包括java.util.Date.java.sql.Date.java.sql.Timest ...

  2. lvs-dr

    第5节  dr模型 在rs上配置 :rip  和vip   vip定义在lo别名上 Director 上配置:vip  和dip 都只需要一块网卡  网卡都桥接 Vip: 192.168.0.105 ...

  3. Kafka的接口回调 +自定义分区、拦截器

    一.接口回调+自定义分区 1.接口回调:在使用消费者的send方法时添加Callback回调 producer.send(new ProducerRecord<String, String> ...

  4. flume初识

    一.flume特点 flume是目前大数据领域数据采集的一个利器,当然除了flume还有Fluentd和logstash,其他的目前来说并没有深入的了解,但是我觉得flume能够在大数据繁荣的今天屹立 ...

  5. OSPF补全计划-1

    OSPF全称是啥我就不絮叨了,什么迪杰斯特拉,什么开放最短路径优先算法都是人尽皆知的事儿,尤其是一提算法还会被学数据结构的童鞋鄙视,干脆就不提了,直接开整怎么用吧.(不过好像真有人不知道OSPF里的F ...

  6. SSM整合Activiti

    1.pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

  7. Python2.*与Python3.*共存问题

    安装Python 2.7后,本来在3.4下能正常使用的脚本无法运行.网上有的方法是把两个版本的主程序分别改名为python2和python3,人眼判断脚本,手输命令行执行脚本.像我这样喜欢双击.拖拽的 ...

  8. jemter模拟高并发访问(亲测ok)

    https://blog.csdn.net/a574258039/article/details/19549407

  9. Java 消除过期的对象引用

    内存泄漏的第一个常见来源是存在过期引用. import java.util.Arrays; import java.util.EmptyStackException; public class Sta ...

  10. JS中原始类型Null和Undefined

    Undefined类型只有一个值,即undefined.当声明的变量还未被初始化时,变量的默认值为undefined.Null类型也只有一个值,即null.null用来表示尚未存在的对象,常用来表示函 ...