如何一键把你的Unity脚本从GB2312编码格式改成UTF8编码格式

一、GB2312和UTF8简介

  • GB2312(全称:中国国家标准GB2312-80字符集)和UTF-8(全称:Unicode Transformation Format 8-bit)是两种常见的字符编码方案。它们分别用于对文本进行编码,以在计算机系统和文件中存储和表示字符。

  • GB2312:
    GB2312是一个用于简化中文字符表示的字符编码,是中国大陆的第一个汉字编码标准。GB2312于1980年代发布,其中“GB”表示“国标”,即中国国家标准。GB2312涵盖了约7,000个简体中文字符、部分日文假名(平假名和片假名)、希腊字符、俄文字母、数学符号等。GB2312采用双字节(即每个字符占用两个字节,位数为16位)编码方案,支持已编码字符的互换。

  • UTF-8:
    UTF-8是对Unicode字符集进行编码的一种可变宽度编码方案。Unicode是一个国际标准,覆盖世界上几乎所有的字符,包括各种文字、符号等。UTF-8是其中最常用的一种方式,因为它具有良好的兼容性,容易被许多软件和操作系统所采用。

二、GB2312的“毛病”

如何一键把你的Unity脚本从GB2312编码格式改成UTF8编码格式_第1张图片

三、鼠标右键一键更改

(1)选中脚本,右键选择菜单

如何一键把你的Unity脚本从GB2312编码格式改成UTF8编码格式_第2张图片

(2)执行提示

如何一键把你的Unity脚本从GB2312编码格式改成UTF8编码格式_第3张图片

(3)检查效果

中文正常显示了
如何一键把你的Unity脚本从GB2312编码格式改成UTF8编码格式_第4张图片

四、实现的原理

(1)写编辑器脚本

写一个编辑器脚本,给Project视图选中的物体添加一个右键菜单

[MenuItem("Assets/脚本改格式:GB2312->UTF8无BOM %g", true)]

(2)判断该文件是不是csharp文件

    /// 
    /// 判断该文件是否是CSharp文件
    /// 
    /// 
    /// 
    private static bool IsCSharpFile(string fileName)
    {
        // 获取文件扩展名(包括点)
        string fileExtension = Path.GetExtension(fileName);

        // 将扩展名转换为小写并与 ".cs" 进行比较
        if (fileExtension.ToLower() == ".cs")
        {
            return true;
        }

        return false;
    }

(3)更改编码格式

  /// 
    /// 文件格式转码:GB2312转成UTF8
    /// 读取指定的文件,转换成UTF8(无BOM标记)格式后,回写覆盖原文件
    /// 
    /// 文件路径
    public static void ChangeFormat(string sourceFilePath)
    {
        string fileContent = File.ReadAllText(sourceFilePath, Encoding.GetEncoding("GB2312"));
        File.WriteAllText(sourceFilePath, fileContent, Encoding.UTF8);
        Debug.Log("处理结束!");
    }

五、脚本使用

把该文件拷贝到项目中,Editor文件夹下即可
如何一键把你的Unity脚本从GB2312编码格式改成UTF8编码格式_第5张图片

六、源码

using UnityEngine;
using UnityEditor;
using System.IO;
using System.Text;

public class ChangeScriptEncodingFormat
{
    // 添加一个右键菜单。
    // % 按下ctrl时显示菜单。(Windows: control, macOS: command)
    // & 按下alt时显示菜单。(Windows/Linux: alt, macOS: option)
    // _ 按下shift时显示菜单。(Windows/Linux/macOS: shift)
    [MenuItem("Assets/脚本改格式:GB2312->UTF8无BOM %g", false, 100)]
    private static void CustomMenu()
    {
        // 例如: 获取Project视图中选定的对象
        Object selectedObject = Selection.activeObject;

        if (selectedObject != null)
        {
            // 获取选定对象的相对路径
            string relativeAssetPath = AssetDatabase.GetAssetPath(selectedObject);
            // 获取项目根目录路径
            string projectPath = Path.GetDirectoryName(Application.dataPath);
            // 获取选定对象的绝对路径
            string absoluteAssetPath = Path.Combine(projectPath, relativeAssetPath);
            // 获取选定对象的文件名(包括后缀)
            string fileName = Path.GetFileName(relativeAssetPath);

            Debug.Log("执行自定义操作: " + selectedObject.name +
                      ", 相对路径: " + relativeAssetPath +
                      ", 绝对路径: " + absoluteAssetPath +
                      ", 文件名: " + fileName);

            //判断是否是CSharp文件
            if (IsCSharpFile(fileName))
            {
                Debug.Log("这是一个csharp文件");
                ChangeFormat(absoluteAssetPath);
            }
            else
            {
                Debug.Log("兄弟,这不是一个csharp文件啊~~~~~~~~~~~");
            }
        }
        else
        {
            Debug.LogWarning("没有选中任何对象.");
        }
    }

    // 如果项目视图中有选中的对象,则启用右键菜单项
    [MenuItem("Assets/脚本改格式:GB2312->UTF8无BOM %g", true)]
    private static bool ValidateCustomMenu()
    {
        return Selection.activeObject != null;
    }

    /// 
    /// 判断该文件是否是CSharp文件
    /// 
    /// 
    /// 
    private static bool IsCSharpFile(string fileName)
    {
        // 获取文件扩展名(包括点)
        string fileExtension = Path.GetExtension(fileName);

        // 将扩展名转换为小写并与 ".cs" 进行比较
        if (fileExtension.ToLower() == ".cs")
        {
            return true;
        }

        return false;
    }

    /// 
    /// 文件格式转码:GB2312转成UTF8
    /// 读取指定的文件,转换成UTF8(无BOM标记)格式后,回写覆盖原文件
    /// 
    /// 文件路径
    public static void ChangeFormat(string sourceFilePath)
    {
        string fileContent = File.ReadAllText(sourceFilePath, Encoding.GetEncoding("GB2312"));
        File.WriteAllText(sourceFilePath, fileContent, Encoding.UTF8);
        Debug.Log("处理结束!");
    }
}

你可能感兴趣的:(unity,游戏引擎,GB2312,UTF8)