转: 关于GUI_UPLOAD时CODEPAGE的使用的小知识

http://blog.163.com/fuwa_beijing/blog/static/50467514201068547585/

 

 

在很多项目里,或者一些应用上,我们经常需要把一些文件导入到SAP系统里,最经常我们使用的读取数据的方法就是使用GUI_UPLOAD这个FM.在这个FM中有个CODEPAGE,是用来指定代码页的.  如果我们导的是中文的话,我们经常使用的是8400.当然还有 8401,8411等等. 
主要介绍一下8400/8401.因为大家最常用的是8400.看8400 的介绍上说,是based on GB2312-EUC版本,WINDOWS的代码页就是CP936.8401使用的就是GB18030 2000编码.那么他们的区别在哪里呢. 
[下面的介绍转自http://hi.baidu.com/simadi/blog/item/af1a0bd119852dd0562c842b.html
1、 
GB2312 GB2312(1980年)一共收录了 7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。 
在windows中的代码页是CP936 
2、 
GBKGBK最初是由微软对GB2312的扩展,也就是CP936字码表 (Code Page 936)的扩展(原来的CP936和GB 2312-80一模一样),最初出现于Windows 95简体中文版中,由于Windows产品的流行和在大陆广泛被使用,中华人民共和国国家有关部门将其作为技术规范。注意GBK并非国家正式标准,只是国家技术监督局标准化司、电子工业部科技与质量监督司发布的“技术规范指导性文件”。虽然 GBK收录了所有Unicode 1.1及GB 13000.1-93之中的汉字,但是编码方式与Unicode 1.1及GB 13000.1-93不同。仅仅是GB 2312到GB 13000.1-93之间的过渡方案。GBK收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。 
GBK作为对GB2312的扩展,在现在的windows系统中仍然使用代码页CP936表示,但是同样的936的代码页跟一开始的936的代码页只支持 GB2312编码不同,现在的936代码页支持GBK的编码,GBK同时也向下兼容GB2312编码。 
3、 
GB180302000年的 GB18030取代了GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。现在的PC平台必须支持GB18030,对嵌入式产品暂不作要求。所以手机、MP3一般只支持GB2312。 
GB18030在windows中的代码页是CP54936。 
4、 
GB13000GB13000等同于国际标准的《通用多八位编码字符集 (UCS)》 ISO10646.1,就是等同于Unicode的标准,代码页等等的都使用UTF的一套标准。 
从ASCII、GB2312、GBK到GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼,GB2312、GBK到GB18030都属于双字节字符集 (DBCS)。

以下是 ABAP 实现将上传文件换为 xstring,再将 xstring 换为文件并打开,且解决乱码问题的示例代码: ``` DATA: lv_file TYPE xstring, lv_filename TYPE string, lv_decoded_file TYPE string. * 上传文件 CALL FUNCTION 'GUI_UPLOAD' EXPORTING filename = lv_filename filetype = 'BIN' IMPORTING filelength = lv_filesize TABLES data_tab = lt_file EXCEPTIONS OTHERS = 1. * 将上传的文件从表格换为 xstring CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' EXPORTING input_length = lv_filesize IMPORTING buffer = lv_file TABLES binary_tab = lt_file EXCEPTIONS failed = 1 others = 2. * 将 xstring 换为字符串 CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' EXPORTING buffer = lv_file IMPORTING output_length = lv_filesize TABLES binary_tab = lt_file EXCEPTIONS failed = 1 others = 2. * 将字符串换为本地编码 lv_decoded_file = cl_abap_codepage=>convert_from( lv_file ). * 将文件保存到本地 OPEN DATASET lv_filename FOR OUTPUT IN TEXT MODE ENCODING DEFAULT. IF sy-subrc = 0. TRANSFER lv_decoded_file TO lv_filename. CLOSE DATASET lv_filename. ENDIF. * 打开文件 CALL FUNCTION 'GUI_EXEC' EXPORTING application = lv_filename. ``` 其中,`lv_filename` 是上传的文件名,`lt_file` 是上传的文件数据,`lv_file` 是换后的 xstring 数据,`lv_decoded_file` 是解码后的文件数据,`cl_abap_codepage=>convert_from` 方法可以将换后的数据换为本地编码,`OPEN DATASET` 和 `CLOSE DATASET` 语句可以将数据保存到本地文件,`CALL FUNCTION 'GUI_EXEC'` 语句可以打开本地文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值