首页 > 解决方案 > SQLite/AutoHotkey,我对 sqlite3_result_text 返回函数的编码有问题

问题描述

我正在 AutoHotkey 中使用 SQLite 编写用户定义函数。

当我只使用(返回)英语时,它的效果很好。

但是,如果我使用(返回)任何带有非英语的字符,它会产生损坏的结果。对我来说,损坏的结果有一些规则 - 它的长度与非英语字符完全相关。

有人听说过吗?

我猜这是 SQLite 的“ sqlite3_result_text ”函数的问题。如果是这样,我想正确使用它。

谢谢

[编辑]

我也用“ sqlite3_result_text64 ”测试过。
并且,确认了同样的问题。我不知道造成这种困难的根本原因是什么。非常难的一个。

以下是实际情况截图(与示例代码有点不同,示例代码对于这个问题帖子非常简化)。第一行运行良好(仅限英文)。第二行是相同的内容,但用 CJK 翻译,所以完美地打破了。每行的前 3 个和最后 3 个字符只是为了确保它被正确处理,正如您所看到的那样,它被很好地对待——就像英语一样被很好地对待。

第一张图在这里

Global myReturn
myReturn := "HK"        ;  "HK" works well. But, "香港" emits problem.
myReturn := "香港"    
DllCall("LoadLibrary", "Str", A_ScriptDir "\SQLite3.dll", "UPtr")
DllCall("SQLite3\sqlite3_open", "Ptr", myUnicode(":memory:"), "PtrP", myDbH, "Cdecl Int")
DllCall("SQLite3\sqlite3_create_function_v2", "Ptr", myDbH, "AStr", "UDF", "Int", -1, "Int", 1, "Ptr",, "Ptr", RegisterCallback("myCallBack"), "Ptr", 0, "Ptr", 0)
myQuery .= "CREATE TABLE myT(myC1 TEXT, myC2 TEXT);"                    
myQuery .= "INSERT INTO myT(myC1, myC2) VALUES('China', '中国');"
myQuery .= "INSERT INTO myT(myC1, myC2) VALUES('HongKong', UDF());"
DllCall("SQLite3\sqlite3_exec", "Ptr", myDbH, "Ptr", myUnicode(myQuery), "Int",, "Ptr",, "PtrP",, "Cdecl Int")
MsgBox % myShowResults(myDbH)   
Return

myCallBack(myDbH)                                                   
{ 
    DllCall("SQLite3\sqlite3_result_text", "Ptr", myDbH, "AStr", myReturn, "Int", -1) 
}
myShowResults(myDbH) 
{
    DllCall("SQLite3\sqlite3_get_table", "Ptr", myDbH, "Ptr", myUnicode("SELECT * FROM myT"), "PtrP", TbAddress, "IntP", myRows, "IntP", myColumns, "PtrP",, "Cdecl Int")   
    myTable := []
    Loop, % myColumns
    myOffset += A_PtrSize
    Loop, % myRows
    {
        i := A_Index, myTable.Rows[i] := []
        Loop, % myColumns
            myTable.Rows[i][A_Index] := StrGet(NumGet(TbAddress+0, myOffset, "UPtr"), "UTF-8"), myOffset += A_PtrSize
    }
    If(myRows = 0)
        Return
    For Each, x In myTable.Rows
        myResult .= x[1] "   " x[2] "`n"
    Return myResult
}
myUnicode(myInput) 
{
    Global
    VarSetCapacity(myUnicodeOutput, StrPut(myInput, "UTF-8"), 0)
    StrPut(myInput, &myUnicodeOutput, "UTF-8")
    Return &myUnicodeOutput
}

最后,我已经确认万一“只有英语”也有问题。它没有英文,对吧。但是,它显然是“Unicode”..我得到了坏的结果。这真太了不起了..

第二张图在这里

标签: sqliteautohotkeycjkc-api

解决方案


推荐阅读