如何在PowerBuilder中读取/转换EncodingUTF8到EncodingANSI?

时间:2013-10-01 10:33:26

标签: powerbuilder

我有一个文本文件,其数据类型编码为EncodingUTF-8。如果纯英文字符,则成功解析所有数据并将其导入表中。但是如果在该领域中混合了汉字,则会出现问题。如果有中文字符等混合字符,如何成功读取和解析数据。

下面是包含中文字符的文本制表符分隔文件示例。在调试模式期间,变量ls_unicode保存文本文件的值并且中文字符存在,

enter image description here

当数据保存在表格中时,这就是输出:

enter image description here

下面的脚本设法获取中文字符并且DW更新方法返回成功但是当我检查了列中的值时,它显示“Globe MUX Project(?????:NA)”而不是Globe MUX Project(客户合同号:NA)。 我还从调试模式验证了Globe MUX Project(客户合同号:NA)的值。 DB列也更改为NVarChar数据类型。

 //#################################
li_FileNum = FileOpen(is_sourcepath, StreamMode!, Read!, LockWrite!)
ll_FileLength = FileLength(is_sourcepath)
eRet = FileEncoding(is_sourcepath)
IF eRet = EncodingANSI! and ll_filelength <= 32765 THEN 
    li_bytes = FileReadEx(li_FileNum, lbl_data)     
    ls_unicode = String(lbl_data, EncodingUTF8!)    

    dw_1.Reset( )
    dw_1.ImportString(ls_unicode)
    ls_sonum = String(dw_1.Object.shipmentOrderNum[1])
    ls_chinesechar = String(dw_1.Object.contractnum[1])
    sle_char.Text = String(dw_1.Object.contractnum[1])
    dw_1.SetItem(1,'contractnum',ls_chinesechar)
    dw_1.SetItem(1,'fname','TEST')
END IF
FileClose(li_FileNum)


IF dw_1.Update( ) = 0 THEN 
    Commit Using SQLCA;
END IF
//#################################

我还做了一个测试并做了一个手工SQL插入语句,它在列中成功记录了值'Globe MUX Project(客户合同号:NA)'。我认为如果列数据类型是NVarChar / NChar /或NText,PB不会自动执行此操作。

INSERT INTO SCH_HUAWEI_EDI_3B12RHDR (  COntractnum , FNAME ) 
VALUES ( N'Globe MUX Project(客户合同号:NA)' , 'TEST' ) 

2 个答案:

答案 0 :(得分:1)

Powerbuilder需要在utf-8或utf-16文件的开头出现BOM (Byte Order Mark)才能正确读取,或者使用FileEncoding()正确检测编码。

在您的情况下,当使用十六进制编辑器查看文件时,第一个字节必须显示EF BB BF,即ut-8 BOM。

一旦文件具有utf-8 BOM,您就不必转换文件内容,PB将自动执行。对于v10和更高的PB,所有字符串数据都在内部转换并在utf-16中处理。

顺便说一句,在你提议的pbscript中,你要关闭文件两次。

答案 1 :(得分:0)

我发现它应该在列数据类型中进行管理。我已将数据库列的数据类型从varchar更改为NVarChar,并更新表格如下:

UPDATE SCH_HUAWEI_EDI_3B12RHDR SET contractnum = N'Globe MUX Project(客户合同号:NA)' 
WHERE ShipmentOrderNum = 'DPH11309160073CC'

预期结果集为:

enter image description here

在更新声明中,设置值前面加上大写字母N.由于我使用数据存储区进行更新,您对如何合并上述更新声明的建议是什么?或者更好的问题是,如何在PowerBuilder中使用数据存储区存储中文字符?

以下是PB脚本:

IF (ids_edihdr.ImportFile(ls_SourcePath,1,1) = 1 ) AND (ids_edidtl.ImportFile(ls_SourcePath,2) > 0 ) THEN 
    //HEADER
    IF ids_edihdr.RowCount() = 1 THEN 

                // Add script here to manage the mixed English and Chinese character values.

        ids_edihdr.SetItem(1,'Fname',Upper(as_file))
        ids_edihdr.SetItem(1,'CREATEDBY',Upper(SQLCA.LogID))    
        ids_edihdr.SetItem(1,'CREATEDDATE',idt_TranDate)    
    END IF
END IF

ids_edihdr.AcceptText()

ll_ret = ids_edihdr.Update()
IF ll_ret < 0 THEN GOTO ERR

Commit Using SQLCA; 
ls_DestPath = is_ArchInboundPath + Upper(as_file)
FileCopy(ls_SourcePath,ls_DestPath)
FileDelete(ls_SourcePath)               
GOTO DEST

ERR:
ROLLBACK Using SQLCA;
ls_ErrorPath = is_archerrorpath + Upper(as_file)
FileCopy(ls_SourcePath,ls_ErrorPath)
FileDelete(ls_SourcePath)

DEST:
Destroy ids_edihdr