编辑器中文乱码?搞定它那就是洒洒水啦~~
前言
很多朋友会发现中文字有时候在 Unity 编辑器中会出现乱码,每次都得通过 vs “另存为...” 的方式来解决这个问题,着实困扰;
其实啊,我发现导致乱码问题的根源是 visual studio 对带有中文的代码默认是以 gb2312 编码格式保存的,有时候改成了 utf-8 no bom,保存的时候又变回去了。
下面这个同学的探究就挺真实,他记录的点滴估计每个在这上面吃亏的人都能够感同身受,当然他最后也找到了一个非常不错的解决方案,感兴趣的可以看看- [Unity3D] C#脚本支持中文编码_VS编辑器
解决方案:
笔者感觉 c# 语言中想要正确的层别出各种文本编码真的好难,好纠结,但好在我只需要处理 GB2312 与 utf-8 编码,于是问题就化简成了这两个:1. 怎么层别文本文档的编码是 utf-8?、2. 怎么层别文本文档的编码是 GB2312?
闲话少述,下面直接贴编码识别的解决方案:
public static bool DetectFileEncoding(string file, string name)
{
var encodingVerifier = Encoding.GetEncoding(name, new EncoderExceptionFallback(), new DecoderExceptionFallback());
using (var reader = new StreamReader(file, encodingVerifier, true, 1024))
{
try
{
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
}
return reader.CurrentEncoding.BodyName == name;
}
catch (Exception)
{
return false;
}
}
}
这里我们直接使用 API Encoding.GetEncoding
来尝试获取指定的编码,同时分别插入En(De)coderExceptionFallback
(编/解码异常回调),并尝试读取一段数据,如果 try catch 逻辑捕捉到了异常,则判定文本不是指定的编码格式,这很巧妙!
于是通过 DetectFileEncoding(file, "utf-8")
我们就能判断文本是否为 UTF8 编码,同样道理,通过DetectFileEncoding(file, "gb2312")
判断文本是否为 GB2312 。
然而 没有 bom(Byte Order Mark - 字节顺序标记) UTF-8 编码的文档却在 DetectFileEncoding(file, "gb2312")
时返回 true;于是判断文本是否需要转码保存的依据就不得不变成这样(尽管调用起来啰嗦透顶):
// 因为 DetectFileEncoding 函数判断 gb2312 时,对 utf-8 no bom 返回了true,所以做双重判断
static bool IsNeedConvertToUtf8(string file) => !DetectFileEncoding(file, "utf-8") && DetectFileEncoding(file,"gb2312");
至此,当判断出脚本是否需要转换为 UTF8 了,接下来便使用 IO 读取、写入,实现转码,因为脚本已开源,所以在这也就不多做说明啦!
演示
- 支持 Project 窗口单个脚本文件、多个脚本文件、文件夹选中后手动进行编码转换
- 支持设置为自动编码转换,编辑器将在脚本被保存或者重新导入时自动处理编码问题
结语
- 这个组件对脚本中有汉字的人会有帮助,它解决了某些情况下脚本编码会变成 GB2312 导致 Unity 识别异常的问题。
- 为保万全,使用这个脚本前,请务必先使用 git 托管你的代码。
扩展阅读:
- Script-Encoding-Converter
- stackworkflow - 暂时未找到原始出处
- AssetPostprocessUTF8Encode.cs - 更多的编码判定逻辑,是否满足你的需求请自测
版权所有,转载请注明出处!