解决 SAP 使用 GUI_UPLOAD 上传 txt 文件乱码问题
在使用 SAP 的标准 Function GUI_UPLOAD 上传包含中文的 txt 文档时,遇到了乱码问题,解决的关键在于正确设置编码参数。

原代码如下:
REPORT ztest.
DATA: lv_file_name TYPE string VALUE 'C:\temp.txt',
lv_file_length TYPE i,
lt_content TYPE string_table,
lv_content TYPE string.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = lv_file_name
IMPORTING
filelength = lv_file_length
TABLES
data_tab = lt_content.
LOOP AT lt_content INTO lv_content.
WRITE:/ lv_content.
ENDLOOP.
这其实是接口没有识别出文档的编码方式所致,需要增加一个 codepage 传参来声明文档的编码格式。
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = lv_file_name
codepage = '4110'
IMPORTING
filelength = lv_file_length
TABLES
data_tab = lt_content.
为什么是 4110 呢?

来到函数的说明文档中,文中说 SCP_CODEPAGE_BY_EXTERNAL_NAME 可以提供外部编码对应的 SAP 编码号,由于我的 txt 文档是 UTF-8 格式。


执行函数查询,可知 UTF-8 在 SAP 系统内的编码就是 4110。
修改代码后执行,结果就正常了。

深入探究
SAP 中有一个功能模块:SCP_CODEPAGE_INFO,他能返回每一种编码对应的具体含义。

而当我们入参 codepage 不传值的时候,系统会自动根据 GUI 端的环境计算。

参数 prcLoginLanguage = 1,代表中文ZH,FETYPE = ‘MS’,是操作系统的缩写,允许值有 MS(Windows )、MAC(苹果)、UNX(类 Unix 系统 )、OS2 。

这种系统内部调用的方式,已经到了普通 debug 难以抵达的地步了,只能通过猜测来分析。返回值与我们的操作系统和语言相关。从选项中我们能看到我的字符集是 GB2312,结合表 TCP00A 能给我们更多信息。
Note 中给了一种解决方案,能让用户在不改动代码的情况下暂时解决问题。

用户需要手动在logon界面将连接配置中的编码改为目标文件的编码 但是研究了这么多,我想问:究竟有没有一种方式,能在上传文件时自动识别文件编码,而不是古板的指定编码?
要识别文件的编码,需要从一个叫 BOM 的东西下手,Byte Order Mark(字节顺序标记),它是一个特殊的 Unicode 字符(编码为U+FEFF),主要用于标识文本文件的编码格式和字节序(在多字节编码中,字节的排列顺序)。
但问题在于,有些系统生成的文件并不含 BOM,换句话说——有没有 BOM,不一定。
我目前还没找到,欢迎知道的朋友指点。