我正在 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”..我得到了坏的结果。这真太了不起了..