美文网首页unity
[Unity3D] 一键帮你解决编辑器脚本中文乱码!

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

作者: 雨落随风 | 来源:发表于2022-08-21 00:39 被阅读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 读取、写入,实现转码,因为脚本已开源,所以在这也就不多做说明啦!

    演示

    • 支持 Project 窗口单个脚本文件、多个脚本文件、文件夹选中后手动进行编码转换
    • 支持设置为自动编码转换,编辑器将在脚本被保存或者重新导入时自动处理编码问题

    结语

    • 这个组件对脚本中有汉字的人会有帮助,它解决了某些情况下脚本编码会变成 GB2312 导致 Unity 识别异常的问题。
    • 为保万全,使用这个脚本前,请务必先使用 git 托管你的代码。

    扩展阅读:

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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/zyfsiltx.html