sqlite - 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”..我得到了坏的结果。这真太了不起了..
解决方案
推荐阅读
- imagej - ImageJ:使用脚本参数询问输入 n 次?
- c# - MongoDB .NET 驱动程序 ProjectionDefinition Slice 方法不起作用
- node.js - 是否可以在状态/过滤器流上同时使用跟踪和跟随参数?
- python - 我需要访问字典列表中的所有 [Location][LocationCategory]。列表中有 421 部词典。不断报错
- react-native - Realm.js - default.realm 已经在当前线程上以不同的模式打开
- python-3.x - 如何获得真正的 Landsat 图像conrers
- javascript - 如何在 vanilla html 和 vue cdn 中使用 trading-vue 库
- elasticsearch - 根据映射向elasticsearch插入数据
- javascript - npx degit 找不到 master 的提交哈希
- sql - 在多个条件下合并