Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite/AutoHotkey,我对sqlite3_结果_文本返回函数的编码有问题_Sqlite_Autohotkey_Cjk_C Api - Fatal编程技术网

SQLite/AutoHotkey,我对sqlite3_结果_文本返回函数的编码有问题

SQLite/AutoHotkey,我对sqlite3_结果_文本返回函数的编码有问题,sqlite,autohotkey,cjk,c-api,Sqlite,Autohotkey,Cjk,C Api,我正在用AutoHotkey中的SQLite编写一个用户定义函数 当我只使用(返回)英语时,它能很好地工作。 但是,如果我使用(返回)任何非英语字符,它会产生错误的结果。 对我来说,这个被打破的结果有一些规则——它的长度与非英语的字符完全相关 有人听说过吗 我想这是SQLite的“sqlite3\u result\u text”函数的问题。 如果是这样,我想正确使用它 谢谢 [编辑] 我也用“sqlite3\u result\u text64”进行了测试。 并且,证实了同样的问题。我不知道这一困

我正在用AutoHotkey中的SQLite编写一个用户定义函数

当我只使用(返回)英语时,它能很好地工作。

但是,如果我使用(返回)任何非英语字符,它会产生错误的结果。 对我来说,这个被打破的结果有一些规则——它的长度与非英语的字符完全相关

有人听说过吗

我想这是SQLite的“sqlite3\u result\u text”函数的问题。 如果是这样,我想正确使用它

谢谢

[编辑]

我也用“sqlite3\u result\u text64”进行了测试。
并且,证实了同样的问题。我不知道这一困难的根本原因是什么。很难

下面是一些真实情况下的屏幕截图(与示例代码有点不同,对于这篇问题帖子,示例代码是非常简化的)。第一行运行良好(仅限英语)。第二行内容相同,但翻译为CJK,因此完全断开。每行的前3个字符和最后3个字符只是为了确保正确处理,正如你所看到的,它和英语一样处理得很好

最后,我已经证实,万一“只有英语”也有问题。它没有英语,对吗。但是,它显然是“Unicode”。。我得到了一个坏结果。这太神奇了


是吗?@user3419297我不知道。但是,当你看到我的代码的第一条记录时,它是用中文写的,而且效果很好。(对不起,我刚刚编辑了我的主要帖子)。如果你有记事本++或其他高级编辑器,你可以看到你的脚本正在编码的格式。也许更改该格式可以解决问题。@user3419297啊..只是将其更改为您提到的“UTF-8 BOM(我使用记事本++)”。但是,没有变化。仍然对汉语视而不见”香港". 但是,”中国“效果很好。所以,这肯定不是AHK脚本本身编码的问题。再次感谢您的评论。不幸的是,我在这方面没有经验。我甚至不知道您的脚本是如何工作的,出于什么目的。如果我测试您的代码,我所看到的只是一个空消息框。所以我不能说它有什么问题。是吗?@user3419297 I?”不知道。但是,当你看到我的代码的第一条记录时,它是用中文写的,而且很好用。(对不起,我刚刚编辑了我的主要帖子)如果你有记事本++或其他高级编辑器,你可以看到你的脚本正在编码的格式。也许更改该格式可以解决问题。@user3419297啊..只是将它更改为你提到的“UTF-8 BOM”(我用的是记事本++)。但是,没有变化。仍然对中文视而不见香港“但是,”中国“效果很好。所以,这肯定不是AHK脚本本身编码的问题。再次感谢您的评论。不幸的是,我在这方面没有经验。我甚至不知道您的脚本是如何工作的,出于什么目的。如果我测试您的代码,我所看到的只是一个空消息框。所以我不能说它有什么问题。”。
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
}