Powerbuilder:UTF-8的ImportFile(将UTF-8转换为ANSI)

问题描述 投票:1回答:1

我的Powerbuilder版本是6.5,不能使用更高版本,因为这是我支持的。

我的问题是,当我在做dw_1.ImportFile(文件)时,第一行和第一列有一个有趣的字符串,如下所示:



直到我尝试打开文件并将其保存到新的文本文件并尝试导入新文件时,我才明白这一点。在没有搞笑字符串的情况下,它可以完美地工作。

我的结论是发生了这种情况,因为文件是UTF-8(如NOTEPAD ++中所示),新文件是Ansi。我试图导入的文件是由第三方自动提供的,我的用户不希望这样做的额外工作。

如何在powerbuilder中强制将此文件转换为ANSI。如果没有,我可能要做一个命令提示转换,任何想法?

utf-8 powerbuilder datawindow
1个回答
3
投票

奇怪的字符是(可选的)utf-8 BOM,告诉编辑文件是utf-8编码的(因为除非我们遇到代码127之上的转义字符,否则很难知道它)。你不能把它摆脱,因为如果你的文件包含127以上的任何字符(重音或任何特殊字符),你的显示数据中仍然会有垃圾(例如:é - > é - > €,...)特殊字符将变为2到4个垃圾字符。

我最近需要将一些utf-8编码的字符串转换为“ansi”windows 1252编码。使用PB10 +版本,utf-8和ansi之间的重新编码非常简单

b = blob(s, encodingutf8!)
s2 = string(b, encodingansi!)

但是string()blob()在PB发布10之前不支持编码规范。

您可以做的是自己阅读文件,跳过BOM,要求Windows通过MultiByteToWideChar() + WideCharToMultiByte()转换字符串编码,并使用ImportString()加载转换后的字符串。

获取文件内容的概念证明(使用此读取方法,文件不能大于2GB):

string ls_path, ls_file, ls_chunk, ls_ansi
ls_path = sle_path.text
int li_file
if not fileexists(ls_path) then return

li_file = FileOpen(ls_path, streammode!)
if li_file > 0 then
    FileSeek(li_file, 3, FromBeginning!) //skip the utf-8 BOM

    //read the file by blocks, FileRead is limited to 32kB
    do while FileRead(li_file, ls_chunk) > 0
        ls_file += ls_chunk //concatenate in loop works but is not so performant
    loop

    FileClose(li_file)

    ls_ansi = utf8_to_ansi(ls_file)
    dw_tab.importstring( text!, ls_ansi)
end if

qazxsw poi是一个全局函数,它是为PB9编写的,但它应该与PB6.5一样:

utf8_to_ansi()
© www.soinside.com 2019 - 2024. All rights reserved.