系统是老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. CodeForces 516C Drazil and Park 线段树

    原文链接http://www.cnblogs.com/zhouzhendong/p/8990745.html 题目传送门 - CodeForces 516C 题意 在一个环上,有$n$棵树. 给出每一 ...

  2. Java中byte、short、char、int、long运算时自动类型转化问题

    -------------------------------------------------------------------------------------------------- ★ ...

  3. .netcore加入APM系统 SkyWalking

    安装环境:windows 2016 必要条件: JDK8+ Elasticsearch 5.x(注:目前不支持es6) 8080,10800,11800,12800 端口不被占用 下载skywalki ...

  4. ML激活函数使用法则

    sigmoid .tanh .ReLu tanh 函数或者双曲正切函数是总体上都优于 sigmoid 函数的激活函数. 基本已经不用 sigmoid 激活函数了,tanh 函数在所有场合都优于 sig ...

  5. day38 mycql 初识概念,库(增删改查),表(增删改)以及表字段(增删改查),插入更新操作

    在Navicat中把已经生成的表逆向成模型 数据库上,右键-逆向数据库到模型 ego笔记: 增删改查 文件夹(库) 增 create database day43 charset utf8; 改 al ...

  6. String.IsNullorEmpty()方法的使用

    != null 就是不为null !string.IsNullOrEmpty  不是null且不是""(string.Empty)

  7. 2018年中国研究生数学建模竞赛C题 二等奖 赛题论文

    2018年中国研究生数学建模竞赛C题 对恐怖袭击事件记录数据的量化分析 恐怖袭击是指极端分子或组织人为制造的.针对但不仅限于平民及民用设施的.不符合国际道义的攻击行为,它不仅具有极大的杀伤性与破坏力, ...

  8. ContentProvider工作原理

    --摘自<android插件化开发指南> 1.系统管理类app,比如手机助手,有机会频繁使用ContentProvider 2.通讯录或者短信数据,是以ContentProvider的形式 ...

  9. 【python】web开发

    No1: hello.py def application(environ,start_response): start_response('200 OK',[('Content-Type','tex ...

  10. python实现简单工厂模式

    python实现简单工厂模式 模式定义 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式.在简单工 ...