AutoHotkey中Unicode字符存储与使用问题求助
AHK脚本Unicode表情乱码问题解决办法
嘿,我帮你捋捋这个头疼的Unicode乱码问题!这种情况我之前碰过好几次,其实就是AHK对编码的处理细节没搞对,调整几个小地方就能解决啦~
先明确你遇到的核心问题:
- 把AHK文件保存为带BOM的UTF-8格式后,刚粘贴的Unicode表情显示正常,但重新打开脚本就变成问号和乱码
- 执行
SendInput时,输出的也是问号乱码,不是预期的表情符号
问题根源:
AHK v1默认会用系统的ANSI编码解析脚本,哪怕你把文件存成带BOM的UTF-8,它也可能不认,直接把Unicode字符转成乱码。另外SendInput的原生写法对复杂Unicode字符的兼容性也不太好。
具体解决步骤:
给脚本加编码声明(最关键!)
在脚本的第一行(任何代码、注释之前)加上这句代码,告诉AHK要用UTF-8编码读取脚本内容:#Encoding UTF-8确认文件保存格式
确保编辑器保存时选的是「UTF-8 with BOM」,别选成普通UTF-8(不带BOM)——AHK v1对不带BOM的UTF-8文件识别容易出问题。比如Notepad++保存时,在编码选项里一定要选对。优化Unicode字符的发送方式
直接用SendInput {raw}%变量%对复杂表情的兼容性一般,改用剪贴板中转的方式更稳妥:Clipboard := MyVarEmoticonChoices SendInput, ^v Clipboard := "" ; 清空剪贴板避免干扰其他操作变量赋值的小优化
把传统赋值方式=改成表达式赋值:=,对Unicode字符的支持更稳定,比如:MyVarEmoticonChoices := "(╯°□°)╯︵ ┻━┻"
修改后的完整脚本:
#Encoding UTF-8 ; 必须放在脚本最开头 MyVarEmoticon = (Ltrim What is your choice? (Enter #): 1. (╯°□°)╯︵ ┻━┻ 2. (┛ಠ_ಠ)┛彡┻━┻ 3. (╯°Д°)╯︵/(.□ . \\) 4. ┏━┓┏━┓┏━┓ ︵ /(^.^/) ) InputBox, MyVarEmoticonChoices, Emoticon Choices, %MyVarEmoticon%, , 400, % HEmoticon(MyVarEmoticon),,,,,1 HEmoticon(MyVarEmoticon) { StringReplace, MyVarEmoticon, myvaremoticon, `n, `n, UseErrorLevel Lines := ErrorLevel + 1 height := lines * 30 ; 可以根据自己的需求调整这个数值 if (Height < 40) ; 防止窗口高度太矮 Height += 80 Return height } if ErrorLevel { ; MsgBox, CANCEL was pressed. } else { if (MyVarEmoticonChoices = "1"){ MyVarEmoticonChoices := "(╯°□°)╯︵ ┻━┻" } if (MyVarEmoticonChoices = "2"){ MyVarEmoticonChoices := "(┛ಠ_ಠ)┛彡┻━┻" } if (MyVarEmoticonChoices = "3"){ MyVarEmoticonChoices := "(╯°Д°)╯︵/(.□ . \\)" } if (MyVarEmoticonChoices = "4"){ MyVarEmoticonChoices := "┏━┓┏━┓┏━┓ ︵ /(^.^/)" } WinGetPos, X, Y, Width, Height, ahk_exe ToW.exe XWVar := X + 39 YHVar := Y + 682 Sleep, 200 ; 改用剪贴板发送Unicode字符,兼容性更好 Clipboard := MyVarEmoticonChoices SendInput, ^v Clipboard := "" }
按照上面的步骤改完,你再保存重新打开脚本,表情符号应该就能正常显示,SendInput也能正确输出啦~
内容的提问来源于stack exchange,提问作者shadowz1337
相关产品推荐
相关产品推荐

