Notepad++实战:3分钟彻底解决Unity中LitJson的BOM编码问题
Notepad++实战:3分钟彻底解决Unity中LitJson的BOM编码问题
当你在Unity项目中遇到JsonException: Invalid character '' in input string这样的报错时,多半是遇到了UTF-8 BOM这个"隐形杀手"。这个看不见的字符会让LitJson等解析库直接崩溃,而Notepad++正是解决这个问题的利器。本文将带你用最短时间彻底解决这个困扰Unity开发者的常见问题。
1. 问题根源:BOM为何成为JSON解析的噩梦
BOM(Byte Order Mark)是微软在UTF-8编码中引入的元数据标记,通常由三个特殊字节EF BB BF组成。对于普通文本文件这无伤大雅,但在JSON解析时却会造成致命问题:
- LitJson等解析器会将其视为非法字符:大多数JSON解析器严格遵循RFC 8259规范,该规范明确禁止在JSON文本开头使用BOM
- 肉眼不可见的调试噩梦:在编辑器中这个字符显示为空,只有通过十六进制查看器才能发现
- 自动化工具生成的常见陷阱:很多在线JSON生成器和Windows平台工具默认使用带BOM的UTF-8
提示:BOM问题不仅影响LitJson,Newtonsoft.Json等主流库同样会报错,解决方案完全通用
2. Notepad++一站式解决方案
2.1 即时转换现有文件
对于已经产生问题的JSON文件,用Notepad++只需三步:
- 右键文件 → "Edit with Notepad++"
- 点击菜单栏"编码" → "转为UTF-8无BOM格式"
- Ctrl+S保存文件
验证是否成功的方法:
# 使用hexdump检查文件头(Linux/Mac) hexdump -C yourfile.json | head -n 1 # 或用PowerShell(Windows) Format-Hex -Path yourfile.json -Count 3正确的无BOM文件应该直接以7B({的ASCII码)开头。
2.2 永久修改默认编码设置
避免每次手动转换的终极方案:
- 打开Notepad++设置 → "首选项"
- 选择"新建"选项卡
- 在"格式"区域:
- 编码选择"UTF-8无BOM"
- 取消勾选"Apply to opened ANSI files"
- 点击"关闭并记住"
| 设置项 | 推荐值 | 作用 |
|---|---|---|
| 默认编码 | UTF-8无BOM | 所有新建文件默认格式 |
| 自动检测 | 关闭 | 防止打开ANSI文件时误转换 |
| 格式转换提示 | 开启 | 修改编码时获得确认 |
3. Unity工程中的防御性编程
即使解决了文件编码问题,也应该在代码层面增加防护:
// 安全的JSON读取方法 public static T LoadJson<T>(string path) { string json = File.ReadAllText(path); // 去除可能的BOM头 if(json.Length > 0 && json[0] == '\uFEFF') { json = json.Substring(1); } return JsonMapper.ToObject<T>(json); } // 安全的保存方法 public static void SaveJson<T>(string path, T data) { UTF8Encoding encoding = new UTF8Encoding(false); // 关键参数false表示无BOM string json = JsonMapper.ToJson(data); File.WriteAllText(path, json, encoding); }常见踩坑场景:
- 使用
Resources.Load读取文本时无法控制编码 - WebRequest下载的JSON可能包含BOM
- 第三方插件生成的配置文件
4. 全工具链编码一致性方案
确保整个开发流程不引入BOM需要多工具配合:
4.1 版本控制配置
在.gitattributes中加入:
*.json text eol=lf charset=utf-8 *.txt text eol=lf charset=utf-84.2 常用编辑器的设置对比
| 工具 | 设置路径 | 推荐配置 |
|---|---|---|
| VS Code | 文件 → 首选项 → 设置 → "files.encoding" | "utf8" |
| Sublime Text | Preferences → Settings → "default_encoding" | "UTF-8" |
| IntelliJ | File → Settings → Editor → File Encodings | 取消"BOM"选项 |
4.3 自动化构建检查
在CI/CD流程中加入BOM检查脚本:
import sys import glob def check_bom(filepath): with open(filepath, 'rb') as f: return f.read(3) == b'\xef\xbb\xbf' for json_file in glob.glob('**/*.json', recursive=True): if check_bom(json_file): print(f"BOM detected in {json_file}") sys.exit(1)把这个脚本集成到Jenkins或GitHub Actions中,可以在合并代码前拦截问题。
