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 统一控制默认读写编码

如果脚本里有很多处 FileReadFileAppendFileOpen,每次都写编码参数会很啰嗦。这时可以在自动执行段统一设置默认编码:

FileEncoding, UTF-8

logFile := A_ScriptDir "\log.txt"
FileAppend, % "第一行中文`r`n", %logFile%

FileRead, text, %logFile%
MsgBox, %text%

FileEncoding, UTF-8 会影响后续未单独指定编码的 FileReadFileReadLine、读取循环、FileAppendFileOpen。如果文件本身带 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 或导入时指定编码。
  • 网页内容异常:检查是否有不可见字符。
  • 命令行输出乱码:检查控制台代码页和程序输出编码。

编码问题不要靠猜。先确认“脚本是什么编码、文件是什么编码、目标程序按什么编码读”,这三件事对齐后,中文乱码通常就能解决。

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。