一个AHK v1.1的脚本程序问题

想在capslock+的软件上增加一个新的功能,自己仿造里面的翻译功能写了一点,基本能运行了,但是有一个编码的问题一直解决不了,来问问各位专家。

具体的代码如下,我是外行人,完全是靠GPT,内容比较乱见谅。

#Include ../lib/lib_json.ahk ;引入json解析文件


keyFunc_OpenAI(){
    ;指定文件编码
    #Persistent
    FileEncoding, UTF-8
    ;确认function调用成功
    msgbox, "OpenAI 启动成功"
    ; 设置OpenAI API密钥
    ;OpenAI_key := "YOUR_OpenAI_key"
    
    ; 定义基础URL地址变量
    ;base_url := "https://api.openai.com/"

    ; 定义模型变量
    ;model := "gpt-4o-mini"

    ; 定义temperature和top_p参数
    ;temperature := 0.7
    ;top_p := 0.9

    global OpenAI_key, base_url, model, temperature, top_p

    OpenAI_key:=CLSets.TTranslate.OpenAI_key
    base_url:=CLSets.TTranslate.base_url
    model:=CLSets.TTranslate.model
    temperature:=CLSets.TTranslate.temperature
    top_p:=CLSets.TTranslate.top_p

    ;确认变量
    MsgBox, [ %OpenAI_key%, %base_url%, %model%, %temperature%, %top_p% ]

    ; 快捷键:Ctrl+Shift+O
    ;^+o::
        ; 获取光标左侧的文本
        clipboard:="" ;将剪贴板清空
        MsgBox, %clipboard% ;确认剪贴板内容清空
        SendInput, ^+{Up}
        Sendinput, ^{c}
        ClipWait, 1
        
        prompt := clipboard 

        
        if (A_IsUnicode) {
            ; 如果 AutoHotkey 运行在 Unicode 模式下,直接使用剪贴板内容
            utf8Prompt := clipboard
        } else {
            ; 如果运行在 ANSI 模式下,将剪贴板内容转换为 UTF-8 编码
            utf8Prompt := ConvertToUTF8(clipboard)
        }
        
        MsgBox, %utf8Prompt%
        
        msgbox, %prompt%

       utf8Prompt := %utf8Prompt%

        ;创建一个空对象
        data := {}

        ; 设置请求数据
        data["model"] := model
        data["messages"] := [{"role": "user","content": utf8Prompt}] ;主要的prompt内容,中文会出现乱码?!
        ;data["temperature"] := temperature
        ;data["top_p"] := top_p

        ; 将data数据转换为JSON格式
        json_data := JSON.Dump(data)
        
        msgbox, %json_data% ;确认data数据是否正确
        ; 构建请求头
        http := ComObjCreate("WinHttp.WinHttpRequest.5.1")
        post_url := base_url . "v1/chat/completions"
        http.Open("POST", post_url)
        http.SetRequestHeader("Content-Type", "application/json")
        http.SetRequestHeader("Authorization", "Bearer " . OpenAI_key)
        http.Send(json_data)
        ; 获取响应
        response := http.ResponseText

        ; 使用 JSON.Load 解析响应 (移除 .Text)
        responseObject := JSON.Load(response)

        ; 获取助手消息内容
        result := responseObject.choices[1].message.content

        ; 显示结果
        MsgBox, %result%

        clipboard := result ;将result数据复制到剪贴板

        return result
    
}


ConvertToUTF8(str) {
    VarSetCapacity(utf8Str, StrPut(str, "CP0") * 2)
    StrPut(str, &utf8Str, "CP0")
    return StrGet(&utf8Str, "UTF-8")
}

以上代码, data["messages"] := [{"role": "user","content": utf8Prompt}],这一行以及

        json_data := JSON.Dump(data)
        
        msgbox, %json_data% ;确认data数据是否正确

上面两行,只要复制的是中文,就不行,传出去的token都是乱码的。
实在是搞不好,只能来这里求助了。
想问问各位,有没有办法处理这个问题啊,GPT4o Gemini都没有能解决这个问题。

@dog 狗哥,来看看帮帮忙。

How to display ResponseText in UTF-8 format? - AutoHotkey Community
原来不是响应数据,没注意 :smiling_face_with_tear:

我运行没发现乱码,只是被json库转义成\uxxxxx的形式了,应该不影响服务端识别的

你这个逻辑有问题啊,
你运行的ahk版本是啥和剪贴板内容是啥编码的没啥关系吧。。。

影响吖,回复过来就是虫子文了啊

可能就是楼上说的,json库的转义,剪贴板复制进去,我看是没有问题的,但是当msgbox, %json_data%的时候,中文就变成/uxxxx的编码了啊。

响应数据乱码是ResponseText的问题,看看之前我用删除线划掉的链接,应该是你需要的


这样的响应也是乱码吗?看起来英文识别出来的啊。

英文正常说明这两种编码的英文字母部分是兼容的,但是中文部分的定义不一样,显示的就是不同的字符

可以把response := http.ResponseText改为如下内容试试:

arr := http.responseBody
pData := NumGet(ComObjValue(arr) + 8 + A_PtrSize)
length := arr.MaxIndex() + 1
response := StrGet(pData, length, "utf-8")
1 个赞

果然,解决了!!!

顺便再问一下,有时候prompt很长,api反应要半天,就会等不到结果了。
怎么样可以让它一直执行,并得到最终的反馈结果,同时又不影响ahk的其他功能?

http.Open("POST", post_url)改为http.Open("POST", post_url, true)

http.Send(json_data)后面加一句http.WaitForResponse(-1)

再次感谢!!