unity

[Unity3D] 一键帮你解决编辑器脚本中文乱码!

2022-08-21  本文已影响0人  雨落随风

编辑器中文乱码?搞定它那就是洒洒水啦~~

前言

很多朋友会发现中文字有时候在 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 读取、写入,实现转码,因为脚本已开源,所以在这也就不多做说明啦!

演示

结语

扩展阅读:

版权所有,转载请注明出处!

上一篇 下一篇

猜你喜欢

热点阅读