1

我有一个数据类型编码为 EncodingUTF-8 的文本文件。如果纯英文字符,则所有数据都成功解析并导入表。但是如果字段中混有汉字,就会出现问题。如果有汉字这样的混合字符,如何成功读取和解析数据。

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

在此处输入图像描述

当数据保存在表中时,输出如下:

在此处输入图像描述

下面的脚本设法获取汉字并且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 Insert语句,它成功地在列中记录了值'Globe MUX Project(客户合同号:NA)'。如果列数据类型是 NVarChar/NChar/或 NText,我认为 PB 不会自动执行此操作。

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

2 回答 2

1

Powerbuilder requires a BOM (Byte Order Mark) to be present at the begining of either utf-8 or utf-16 file to be correctly read, or to detect correctly the encoding with FileEncoding().

In your case, when looking at the file with an hex editor, the very first bytes must show EF BB BF that is the ut-8 BOM.

Once the file has an utf-8 BOM, you should not have to convert the file content, PB will do it automagically. For a v10 and greater PB, all string data is internally converted and handled in utf-16.

BTW, in your proposed pbscript, you are closing the file twice.

于 2013-10-01T11:15:26.977 回答
0

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

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

预期的结果集是:

在此处输入图像描述

在更新语句中,设置值以大写字母 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
于 2013-10-02T07:32:57.057 回答