Db2 如何在cobol中从国家数据类型中删除@字符

Db2 如何在cobol中从国家数据类型中删除@字符,db2,cobol,mainframe,db2-zos,Db2,Cobol,Mainframe,Db2 Zos,在将unicode数据转换为国家字符时,我面临一个问题。 当我使用national of函数将Unicode数据转换为national时,字符串后面会附加一些垃圾字符,如@ 例如 Ws-unicode picx(200) Ws国家图片编号(600) --让Ws-Unicode中的值为これらの変更は. 从java端获取 将国家功能(Ws-unicode,1208)移动到Ws-national --转换后的值是一样的これらの変更は @. 我不想在转换后添加额外的@字符 请帮

在将unicode数据转换为国家字符时,我面临一个问题。 当我使用national of函数将Unicode数据转换为national时,字符串后面会附加一些垃圾字符,如@

例如 Ws-unicode picx(200) Ws国家图片编号(600)

--让Ws-Unicode中的值为これらの変更は. 从java端获取

将国家功能(Ws-unicode,1208)移动到Ws-national

--转换后的值是一样的これらの変更は @.

我不想在转换后添加额外的@字符


请帮助我找出可能的解决方案,我已尝试使用inspect子句将N'@'替换为空格。
它工作得很好,但在某些特定场景中失败了,比如我们从用户端输入了@。在这种情况下,正版@也转换为空格。

使用inspect with reverse,并在@首次出现后停止。

下面是我用来将EBCDIC转换为UTF的代码片段。在捕获字符串长度之前,我还获取了@符号:

STRING                                                       
   FUNCTION DISPLAY-OF (                                     
      FUNCTION NATIONAL-OF (                                 
         WS-EBCDIC-STRING(1:WS-XML-EBCDIC-LENGTH)
         WS-EBCDIC-CCSID                                     
      )                                                      
      WS-UTF8-CCSID                                          
   )                                                         
   DELIMITED BY SIZE                                         
INTO WS-UTF8-STRING
     WITH POINTER WS-XML-UTF8-LENGTH                         
END-STRING                                                   

SUBTRACT 1 FROM WS-XML-UTF8-LENGTH    
这段代码的作用是将EBCIDIC字符串的UTF8表示形式串入另一个变量。WITH POINTER子句将捕获字符串的新长度+1(+1,因为指针位于字符串结束后的下一个位置)

使用此方法,您应该能够确切地知道第二个字符串的长度,并使用该字符串的确切长度

这将删除不需要的@s

编辑:


有一件事我忘了提,在我的例子中,@符号实际上是在大型机上查看实际十六进制时的EBCDIC低值

这并没有解决他为什么要处理这个角色的实际问题“我尝试使用inspect子句将N'@'替换为空格。它工作得很好,但在某些特定场景中失败了,比如我们从用户端输入了@。在这种情况下,正版@也转换为空格。“这就是他所说的是的,但是在第一时间停下来对他有什么帮助?他还说,@被追加到字符串的末尾,因此您的解决方案实际上会删除用户创建的@。我认为OP需要在这里找到一个实际解决问题的方法,而不是把一个创可贴放在上面。我猜想,在字符串被转换成@符号之后,有十六进制字符。请确保仅针对实际字符串字符串使用该函数Ws-Unicode从何处获取其值?Ws-Unicode是我的存储过程的输入参数,Ws-Unicode中的值来自java端感谢@Sagging的建议,但在我的情况下,输入参数的CCSID已经是Unicode,Ws-Unicode在IPARM2 VARCHAR(200)中定义为对于混合数据,“CCSID UNICODE”。但我今天将努力实施你的建议。谢谢again@RamaGaur它应该仍然有效。如果您使用正确的CCSID。我想得到的就是用指针串起来的方法。那么你就知道确切的长度了。谢谢@Sagging,在你的帮助下已经整理好了,实际上我们正在从用户端获取Unicode数据,然后将数据保存到表中(具有国家数据类型)。因此,我所做的是“将National of(Ws-unicode(1:Ws-unicode长度),1208)移动到Ws-National。它现在起作用了。我的字符串中没有额外的@字符。我认为@字符是在我们将空间转换为国家数据时出现的。太棒了!我很高兴这有帮助