PowerBuilder - Dash字符变为无效字符

时间:2014-01-06 04:46:23

标签: powerbuilder

我有一个文本制表符分隔文件,它使用带有ImportFile()方法的DataStore导入到PB。导入过程中没有错误,但是当我检查表格时,短划线字符变为无效字符(â€)。表的列是varchar(300)数据类型。

感谢任何帮助/建议。

enter image description here

当我检查数据库时,结果集是:

enter image description here

以下是我目前实施的导入文件脚本。

//Import File Script
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 

        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

    //DETAIL
    IF ids_edidtl.RowCount() >= 1 THEN
        FOR ll_edidtl = 1 TO ids_edidtl.RowCount()
            ids_edidtl.SetItem(ll_edidtl,'Fname',Upper(as_file))
            ids_edidtl.SetItem(ll_edidtl,'CREATEDBY',Upper(SQLCA.LogID))    
            ids_edidtl.SetItem(ll_edidtl,'CREATEDDATE',idt_TranDate)
        NEXT        
    END IF
END IF

3 个答案:

答案 0 :(得分:0)

导入此文件是否有可能是在Word或Excel中输入的数据?您是否使用十六进制编辑器查看了数据文件?赔率是破折号字符被“智能地”替换为扩展字符,并且您正在进行字符集碰撞。我的赌注是数据文件中的修复,而不是代码。

祝你好运,

特里

答案 1 :(得分:0)

我做了一些研究,并了解到有问题的角色是 unicode dash U + 002D。现在,如果输入文件中的数据看起来很好并且在导入问题时损坏可能是因为PB没有将数据作为Unicode处理,因此您可以使用PB中的函数来修复这种情况。

可以是ansii和unicode之间的database interface you are using doesn't support the conversion(参见第7页)..不确定你是使用管道对象还是数据库驱动程序发挥作用的任何东西。< / p>

无论哪种方式都知道它是一个字符编码问题,修复它应该非常简单,只需使用“EncodingASNI!”即可。或者“EncodingUnicode!”在将文本导入数据窗口之前,对String和Blob方法的枚举参数。如果不可能,那么您可以编写快速例程来读取文件,转换并保存,然后再导入。

如果您不想在导入之前进行转换,可以在实际执行数据库更新之前循环访问数据窗口/数据存储区。

你可以找到examples of code on my blog on converting between ANSI and Unicode,但基本上你只是在String和Blob函数上使用这些编码参数之一。

  • EncodingANSI!
  • 编码UTF8!
  • EncodingUTF16LE! - UTF-16 Little Endian编码(PowerBuilder 10默认)
  • EncodingUTF16BE! - UTF-16 Big Endian编码

答案 2 :(得分:0)

感谢所有评论。我想分享一下我是如何解决这个问题的。我添加了一个脚本来处理文件编码验证和转换。

ll_FileNum = FileOpen(ls_sourcepath, StreamMode!, Read!, LockWrite!, Replace!)
ll_FileLength = FileLength(ls_sourcepath)
eRet = FileEncoding(ls_sourcepath)
IF eRet = EncodingANSI! and ll_filelength <= 32765 THEN 
    li_bytes = FileReadEx(ll_FileNum, lbl_data)     
    ls_unicode = String(lbl_data, EncodingUTF8!)    
    FileClose(ll_FileNum)
END IF

    IF (ids_edihdr.ImportString(ls_unicode,1,1) = 1 ) AND (ids_edidtl.ImportString(ls_unicode,2) > 0 ) THEN 
         <some conditions here....>
    END IF