双倍宽度日语字符的偏移量

2020-09-26 01:33发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


专家您好,

我正在处理日语字符偏移。 以下是示例数据。

JP34HE38理论健康保険料(総报酬)

以下是我用于拆分上述字符串的逻辑:

"获取数据的抽象类型
   lo_typedescr = cl_abap_typedescr => describe_by_data(wa_upload_file)。
   lo_structdescr?= lo_typedescr。
   lt_components_in = lo_structdescr-> get_components()。

   在lt_components_in INTO ls_component中循环。
     UNASSIGN 。
     将结构ls_component-name分配给结构wa_upload_file TO 。
     如果lv_input_data是INITIAL。
       lv_input_data = 。
     其他。
       CONCATENATE lv_input_data  INTO lv_input_data。
     万一。
   结局。

   清除:lo_typedescr,lo_structdescr。
   lo_typedescr = cl_abap_typedescr => describe_by_data(wa_kyuyono)。
   lo_structdescr?= lo_typedescr。
   lt_components_out = lo_structdescr-> get_components()。

   清除:lv_offset,lv_offset_str。
   循环至lt_components_out INTO ls_component。
     l_tabix = sy-tabix。
     清除:lo_elemdescr,lv_offset_data。
       lo_elemdescr?= ls_component-type。
       如果为lo_elemdescr-> type_kind EQ'D'。
         l_length ='8'。
       其他。
         l_length = lo_elemdescr-> output_length。
       万一。

         cl_abap_list_utilities => read_from_display_layout(
                                           出口
                                             display_data = lv_input_data
                                             display_offset = lv_total_offset
                                             display_length = l_length
                                           输入
                                             字段= lv_offset_data)。
  
       lv_offset = l_length。
       将lv_offset添加到lv_total_offset。
       "将数据分配给结构
       UNASSIGN 。
       将结构wa_kyuyono的ls_component-name分配给。
       如果已分配 = lv_offset_data。
       万一。
     万一。
   结局。
 

下面是它应该如何分割,

Var1是4个字符,Var2是3个字符,Var3是1个字符,Var4是20个字符。

问题:

Var4为20个字符。 但是,方法cl_abap_list_utilities => read_from_display_layout仅返回10个字符。 这是因为所占用的字符宽度大于20。

对于这些类型的字符,我们如何使用偏移? 假设,如果我们还有另一个变量,那将是一个问题。

提前谢谢!

BR,
Kiran Kerudi

japanese-characters-issue.jpg (27.7 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


专家您好,

我正在处理日语字符偏移。 以下是示例数据。

JP34HE38理论健康保険料(総报酬)

以下是我用于拆分上述字符串的逻辑:

"获取数据的抽象类型
   lo_typedescr = cl_abap_typedescr => describe_by_data(wa_upload_file)。
   lo_structdescr?= lo_typedescr。
   lt_components_in = lo_structdescr-> get_components()。

   在lt_components_in INTO ls_component中循环。
     UNASSIGN 。
     将结构ls_component-name分配给结构wa_upload_file TO 。
     如果lv_input_data是INITIAL。
       lv_input_data = 。
     其他。
       CONCATENATE lv_input_data  INTO lv_input_data。
     万一。
   结局。

   清除:lo_typedescr,lo_structdescr。
   lo_typedescr = cl_abap_typedescr => describe_by_data(wa_kyuyono)。
   lo_structdescr?= lo_typedescr。
   lt_components_out = lo_structdescr-> get_components()。

   清除:lv_offset,lv_offset_str。
   循环至lt_components_out INTO ls_component。
     l_tabix = sy-tabix。
     清除:lo_elemdescr,lv_offset_data。
       lo_elemdescr?= ls_component-type。
       如果为lo_elemdescr-> type_kind EQ'D'。
         l_length ='8'。
       其他。
         l_length = lo_elemdescr-> output_length。
       万一。

         cl_abap_list_utilities => read_from_display_layout(
                                           出口
                                             display_data = lv_input_data
                                             display_offset = lv_total_offset
                                             display_length = l_length
                                           输入
                                             字段= lv_offset_data)。
  
       lv_offset = l_length。
       将lv_offset添加到lv_total_offset。
       "将数据分配给结构
       UNASSIGN 。
       将结构wa_kyuyono的ls_component-name分配给。
       如果已分配 = lv_offset_data。
       万一。
     万一。
   结局。
 

下面是它应该如何分割,

Var1是4个字符,Var2是3个字符,Var3是1个字符,Var4是20个字符。

问题:

Var4为20个字符。 但是,方法cl_abap_list_utilities => read_from_display_layout仅返回10个字符。 这是因为所占用的字符宽度大于20。

对于这些类型的字符,我们如何使用偏移? 假设,如果我们还有另一个变量,那将是一个问题。

提前谢谢!

BR,
Kiran Kerudi

japanese-characters-issue.jpg (27.7 kB)
付费偷看设置
发送
5条回答
吹牛啤
1楼-- · 2020-09-26 02:23

你好,基兰,

有两个原因。

首先,您需要检查SAP环境中的编码,如果不使用unicode环境,则需要

第二,如果您使用unicode环境,请尝试创建您自己类型的结构。

使用move语句,然后将前4个字符移动到结构的第一个字段,依此类推。

这将解决多语言问题。

此致

Ankit Mahajan

clever101
2楼-- · 2020-09-26 02:16

为什么不简单地使用代码页8000读取文件? (SJIS)

宇峰Kouji
3楼-- · 2020-09-26 02:17

如果不使用代码页8000,我将无法读取SJIS文件。 因此它已经就位。

在这里,问题与文件无关。 我的内部表中已经有内容。

哎,真难
4楼-- · 2020-09-26 02:15

这是我最初的问题的目标,就是要了解您要实现的目标。 因此,您的问题不是关于读取文件,而是关于将WA_UPLOAD_FILE传输到WA_KYUYONO。

由于您具有Unicode系统,每个日语字符都是一个字符(2个字节),因此WA_UPLOAD_FILE + 8(20)将占用20个字符,例如20个日语字符或20种任何类型的字符,所以我不 不了解您的复杂算法。 似乎没用。

问题是:此转移的目标是什么?

PS:cl_abap_list_utilities => read_from_display_layout返回ABAP列表的20列中显示的日语文本的10个字符是正常的。 您到底需要什么?

我还测试了您的代码+添加了变量声明,最后WA_KYUYONO等于WA_UPLOAD_FILE,这就是为什么我说我不明白您的目标是什么(将可编译代码复制到此处进行进一步讨论):

报告。
 数据:开始于wa_upload_file,var1(4),var2(3),var3(1),var4(20),wa_upload_file的结尾,
       lo_typedescr类型参考cl_abap_typedescr,
       lo_structdescr类型参考cl_abap_structdescr,
       lt_components_in TYPE cl_abap_structdescr => component_table,
       ls_component TYPE abap_componentdescr,
       lv_input_data TYPE字符串,
       wa_kyuyono的开始,var1(4),var2(3),var3(1),var4(20),wa_kyuyono的结尾,
       lt_components_out TYPE cl_abap_structdescr => component_table,
       lv_offset TYPE i,
       lv_offset_str TYPE字符串,
       l_tabix TYPE sytabix,
       lo_elemdescr类型参考cl_abap_elemdescr,
       lv_offset_data TYPE字符串,
       l_length TYPE i,
       lv_total_offset类型i。
 字段符号:
                 TYPE任意。
 wa_upload_file ='JP34HE38理论健康保険料(総报酬)'。
 "获取数据的抽象类型
 lo_typedescr = cl_abap_typedescr => describe_by_data(wa_upload_file)。
 lo_structdescr?= lo_typedescr。
 lt_components_in = lo_structdescr-> get_components()。
 在lt_components_in INTO ls_component中循环。
   UNASSIGN 。
   将结构ls_component-name分配给结构wa_upload_file TO 。
   如果lv_input_data是INITIAL。
     lv_input_data = 。
   其他。
     CONCATENATE lv_input_data  INTO lv_input_data。
   万一。
 结局。
 清除:lo_typedescr,lo_structdescr。
 lo_typedescr = cl_abap_typedescr => describe_by_data(wa_kyuyono)。
 lo_structdescr?= lo_typedescr。
 lt_components_out = lo_structdescr-> get_components()。
 清除:lv_offset,lv_offset_str。
 循环至lt_components_out INTO ls_component。
   l_tabix = sy-tabix。
   清除:lo_elemdescr,lv_offset_data。
   lo_elemdescr?= ls_component-type。
   如果为lo_elemdescr-> type_kind EQ'D'。
     l_length ='8'。
   其他。
     l_length = lo_elemdescr-> output_length。
   万一。
   cl_abap_list_utilities => read_from_display_layout(
                                     出口
                                       display_data = lv_input_data
                                       display_offset = lv_total_offset
                                       display_length = l_length
                                     输入
                                       字段= lv_offset_data)。
   lv_offset = l_length。
   将lv_offset添加到lv_total_offset。
   "将数据分配给结构
   UNASSIGN 。
   将结构wa_kyuyono的ls_component-name分配给。
   如果已分配 = lv_offset_data。
   万一。
 ENDLOOP。
灬番茄
5楼-- · 2020-09-26 02:20

您好,Kiaran,

那我想我们有一个解决方案。

鉴于前8个字符为EN,我们需要移动8(20)作为Japanease。

我们知道在Unicode中,所有字符都是全角的八分之一。

对于日语,它将始终为全角。

所以使用8(40)代替8(20)。

一周热门 更多>