啊宇哥哥 2025-09-29 13:30 采纳率: 97.7%
浏览 14
已采纳

Inno Setup .iss 文件编码格式错误导致中文乱码

在使用Inno Setup制作安装包时,若`.iss`脚本文件保存的编码格式为UTF-8且未带BOM(Byte Order Mark),则中文字符串(如安装界面标题、提示信息等)在编译后常出现乱码。这是因为Inno Setup默认仅正确识别ANSI或UTF-8带BOM的文本格式。当编辑器(如VS Code、Notepad++)默认以UTF-8无BOM保存文件时,中文字符无法被正确解析,导致安装界面显示乱码。解决方法是将`.iss`文件另存为“UTF-8-BOM”或“带签名的UTF-8”编码格式。此问题常见于多语言支持场景,是构建本地化安装程序时需重点关注的基础性编码兼容问题。
  • 写回答

1条回答 默认 最新

  • ScandalRafflesia 2025-09-29 13:30
    关注

    1. 问题现象:Inno Setup 编译后中文乱码的典型表现

    在使用 Inno Setup 制作 Windows 安装包时,开发者常遇到安装界面中的中文字符显示为乱码(如“中文”或方框)。该现象多出现在以下场景:

    • 脚本中定义了 [Messages][CustomMessages] 的中文内容
    • 设置了 AppName=我的应用程序 等含中文字段
    • 使用了多语言支持模块([Languages])进行本地化

    尽管源码编辑器中中文正常显示,但编译生成的安装程序仍出现乱码,初步排查排除字体或系统区域设置问题后,应重点检查脚本文件编码。

    2. 根本原因分析:Inno Setup 对文本编码的解析机制

    Inno Setup 编译器(ISCC.exe)基于 Pascal Script 构建,其文本处理逻辑依赖于明确的编码标识。其默认行为如下表所示:

    编码格式BOM 存在性Inno Setup 支持情况
    ANSI✅ 完全支持(默认系统代码页)
    UTF-8❌ 不识别,误判为 ANSI 导致乱码
    UTF-8有(EF BB BF)✅ 正确识别并解析中文
    UTF-16 LE/BE✅ 支持,但不推荐用于 .iss

    当编辑器以 UTF-8 无 BOM 保存 .iss 文件时,Inno Setup 编译器无法感知其实际编码,按当前系统 ANSI 代码页(如 Chinese Simplified GBK)解析 UTF-8 字节流,造成字符错位。

    3. 解决方案路径:从手动修正到自动化预防

    1. 手动修复:在文本编辑器中将 .iss 文件另存为“UTF-8 with BOM”格式
    2. 编辑器配置:设置 VS Code、Notepad++ 等工具默认保存为 UTF-8-BOM
    3. CI/CD 集成:在构建流水线中加入编码校验脚本
    4. 团队规范:制定 .iss 脚本编码标准并纳入代码审查清单

    以下为 Notepad++ 中设置编码的步骤示例:

    1. 打开 .iss 文件
    2. 菜单栏选择“格式” → “转为 UTF-8-BOM 编码”
    3. 保存文件
    4. 重新编译安装包
    

    4. 技术验证流程图:诊断与修复闭环

    graph TD A[发现安装界面中文乱码] --> B{检查.iss文件编码} B -- UTF-8 无 BOM --> C[转换为 UTF-8-BOM] B -- UTF-8-BOM --> D[检查其他可能因素] B -- ANSI --> E[确认是否匹配系统代码页] C --> F[重新编译安装包] F --> G[验证界面显示正常] D --> H[排查字体/语言包配置] E --> I[考虑统一转为 UTF-8-BOM] G --> J[问题解决] H --> J I --> F

    5. 多语言支持中的工程化实践

    在实现多国语言安装包时,建议采用以下结构:

    [Languages]
    Name: "chinesesimplified"; MessagesFile: "compiler:Default.isl"
    Name: "english"; MessagesFile: "compiler:Languages\English.isl"
    
    [CustomMessages]
    chinesesimplified.welcomeLabel=欢迎使用 安装向导
    english.welcomeLabel=Welcome to the Setup Wizard
    
    [Code]
    procedure InitializeWizard();
    begin
      WizardForm.WelcomeLabel.Caption := ExpandConstant('{cm:welcomeLabel}');
    end;
    

    所有引用中文的 .iss 或 .isl 文件均需保存为 UTF-8-BOM,确保跨平台协作时编码一致性。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 9月29日