AHK 脚本里的中文乱码,通常不是“中文不能用”,而是脚本文件编码、读取文件编码、写入文件编码、外部程序编码不一致。尤其是 AHK v1,ANSI 版和 Unicode 版、UTF-8 BOM、FileRead/FileAppend 的编码参数,都容易混在一起。
一、先分清脚本文件编码
AHK v1 读取脚本时,很依赖文件编码。新手最常见的问题是:编辑器保存成了 UTF-8 无 BOM,但旧环境或某些解释器按 ANSI 理解,结果中文变乱码。
#Requires AutoHotkey v1.1 #NoEnv #SingleInstance Force MsgBox, 中文测试:你好,AHK66 return
如果这段代码里的中文弹出来就是乱码,优先检查脚本文件本身的保存编码。对于 AHK v1,中文脚本建议使用 Unicode 版 AutoHotkey,并把脚本保存为 UTF-8 with BOM 或 UTF-16 LE。
二、BOM 是什么
BOM 可以理解为文件开头的编码标记。很多 Windows 程序通过 BOM 判断这个文本是不是 UTF-8。没有 BOM 的 UTF-8 文件,在某些旧环境里可能被当成 ANSI 读取。
所以“UTF-8”和“UTF-8 with BOM”不是同一个体验。写 AHK v1 中文脚本时,如果遇到脚本内中文乱码,先试试带 BOM 的 UTF-8。
三、FileAppend 写文件时指定编码
text := "中文日志测试" logFile := A_ScriptDir "\log.txt" FileAppend, %text%`n, %logFile%, UTF-8 MsgBox, 写入完成
FileAppend 第三个参数可以指定编码。日志、导出文件、CSV,如果要给其他程序读取,最好明确指定编码,不要完全依赖默认值。
四、FileEncoding 统一控制默认读写编码
如果脚本里有很多处 FileRead、FileAppend 或 FileOpen,每次都写编码参数会很啰嗦。这时可以在自动执行段统一设置默认编码:
FileEncoding, UTF-8 logFile := A_ScriptDir "\log.txt" FileAppend, % "第一行中文`r`n", %logFile% FileRead, text, %logFile% MsgBox, %text%
FileEncoding, UTF-8 会影响后续未单独指定编码的 FileRead、FileReadLine、读取循环、FileAppend 和 FileOpen。如果文件本身带 UTF-8 或 UTF-16 的 BOM,AHK 通常会优先按 BOM 判断;如果是新建文件,UTF-8 会写入 UTF-8 BOM,不想写 BOM 时可以用 UTF-8-RAW。
想把旧 ANSI/GBK 文本转成 UTF-8,也可以按“先用正确源编码读,再用目标编码写”的思路处理:
oldFile := A_ScriptDir "\old.txt" newFile := A_ScriptDir "\new_utf8.txt" FileEncoding, CP936 ; 常见简体中文 ANSI/GBK,按实际源文件调整 FileRead, text, %oldFile% FileEncoding, UTF-8 FileDelete, %newFile% FileAppend, %text%, %newFile%
更稳的习惯是:脚本开头先写默认 FileEncoding,临时处理特殊来源文件时再单独指定或临时切换。不要一边按 ANSI 读,一边按 UTF-8 写,却没有在代码里明确说明。
五、FileRead 读文件时的坑
file := A_ScriptDir "\data.txt" FileRead, text, %file% MsgBox, %text%
FileRead 会根据文件内容和环境处理编码,但不是所有无 BOM 文件都能自动猜对。读入后乱码时,要检查源文件到底是 ANSI、UTF-8、UTF-8 BOM,还是其他编码。
六、CSV 中文乱码
CSV 经常在 Excel 里乱码,因为 Excel 对 CSV 编码判断比较挑剔。中文 CSV 如果给 Excel 打开,可以考虑 UTF-8 BOM,或者按目标系统要求导出 ANSI/GBK。
csv := A_ScriptDir "\data.csv" FileDelete, %csv% FileAppend, % "姓名,分数`r`n小明,95`r`n", %csv%, UTF-8
如果打开乱码,可以尝试用 Excel 的“数据导入”功能指定编码,而不是直接双击打开。
七、剪贴板和网页也会有编码问题
剪贴板通常能处理 Unicode,但从网页、命令行、外部程序拿到文本时,仍然可能出现不可见字符、零宽字符、换行差异。遇到“看起来一样但比较失败”的情况,要检查字符串长度和字符码。
八、排查清单
- 脚本内中文乱码:先看脚本文件编码。
- 读文件乱码:确认源文件编码。
- 写文件乱码:给
FileAppend指定编码,或在自动执行段使用FileEncoding, UTF-8。 - 批量读写文本:先用
FileEncoding统一默认编码,特殊文件再单独处理。 - CSV 在 Excel 乱码:尝试 UTF-8 BOM 或导入时指定编码。
- 网页内容异常:检查是否有不可见字符。
- 命令行输出乱码:检查控制台代码页和程序输出编码。
编码问题不要靠猜。先确认“脚本是什么编码、文件是什么编码、目标程序按什么编码读”,这三件事对齐后,中文乱码通常就能解决。

评论(0)