系统是老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. BZOJ4802 欧拉函数 数论

    原文链接http://www.cnblogs.com/zhouzhendong/p/8117744.html 题目传送门 - BZOJ4802 题意概括 Description 已知N,求phi(N) ...

  2. spring cloud (一、服务注册demo_eureka)

    首先我的博客记理论知识很少,大家对spring boot.spring cloud  .分布式 .微服务什么的一点概念都没有的还请先去百度看看理论,知道了是做什么用的,然后再写下demo ,这样学起来 ...

  3. SSM知识点与整合之Spring知识点(pom.xml需要依赖的jar或者plugin)

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  4. MarkdownPad 2在win10上安装及破解(含安装包)

    MarkdownPad 2 是一款较不错的Markdown编辑器,可快速将文本转换为美观的HTML/XHTML的网页格式代码,且操作方便,用户可以通过键盘快捷键和工具栏按钮来使用或者移除Markdow ...

  5. react学习二 生命周期

    转自:https://www.cnblogs.com/gdsblog/p/7348375.html react 中compent getDefaultProps object getDefaultPr ...

  6. TF:Tensorflow定义变量+常量,实现输出计数功能—Jason niu

    #TF:Tensorflow定义变量+常量,实现输出计数功能 import tensorflow as tf state = tf.Variable(0, name='Parameter_name_c ...

  7. 关于使用jmeter函数助手生成随机数的使用方法

    记录自己的生活!   1.使用jmeter函数助手的生成随机数的方法,主要包含以下几个函数:     [_Random]     [_RandomString]   2.关于[_Random]函数的说 ...

  8. anaconda源配置

    1. 生成配置文件 第一次运行 conda config命令时,将会在用户的home目录创建该文件..condarc配置文件,是一种可选的(optional)运行期配置文件,其默认情况下是不存在的. ...

  9. iOS12系统应用发送普通邮件构建邮件

    iOS12系统应用发送普通邮件构建邮件 当确定设备支持邮件发送功能后,开发者就可以实现该功能.根据是否包含附件,邮件可以分为普通邮件和附件邮件两种.本节首先讲解如何发送普通邮件.实现过程如下: 1.构 ...

  10. java发送邮件高级篇

    package com.xiets.javamaildemo; import java.util.Date; import java.util.Properties; import javax.act ...