一、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的“毛病”
三、鼠标右键一键更改
(1)选中脚本,右键选择菜单
(2)执行提示
(3)检查效果
中文正常显示了
四、实现的原理
(1)写编辑器脚本
写一个编辑器脚本,给Project视图选中的物体添加一个右键菜单
[MenuItem("Assets/脚本改格式:GB2312->UTF8无BOM %g", true)]
(2)判断该文件是不是csharp文件
/// <summary>
/// 判断该文件是否是CSharp文件
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
private static bool IsCSharpFile(string fileName)
{
// 获取文件扩展名(包括点)
string fileExtension = Path.GetExtension(fileName);
// 将扩展名转换为小写并与 ".cs" 进行比较
if (fileExtension.ToLower() == ".cs")
{
return true;
}
return false;
}
(3)更改编码格式
/// <summary>
/// 文件格式转码:GB2312转成UTF8
/// 读取指定的文件,转换成UTF8(无BOM标记)格式后,回写覆盖原文件
/// </summary>
/// <param name="sourceFilePath">文件路径</param>
public static void ChangeFormat(string sourceFilePath)
{
string fileContent = File.ReadAllText(sourceFilePath, Encoding.GetEncoding("GB2312"));
File.WriteAllText(sourceFilePath, fileContent, Encoding.UTF8);
Debug.Log("处理结束!");
}
五、脚本使用
把该文件拷贝到项目中,Editor文件夹下即可
六、源码
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;
}
/// <summary>
/// 判断该文件是否是CSharp文件
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
private static bool IsCSharpFile(string fileName)
{
// 获取文件扩展名(包括点)
string fileExtension = Path.GetExtension(fileName);
// 将扩展名转换为小写并与 ".cs" 进行比较
if (fileExtension.ToLower() == ".cs")
{
return true;
}
return false;
}
/// <summary>
/// 文件格式转码:GB2312转成UTF8
/// 读取指定的文件,转换成UTF8(无BOM标记)格式后,回写覆盖原文件
/// </summary>
/// <param name="sourceFilePath">文件路径</param>
public static void ChangeFormat(string sourceFilePath)
{
string fileContent = File.ReadAllText(sourceFilePath, Encoding.GetEncoding("GB2312"));
File.WriteAllText(sourceFilePath, fileContent, Encoding.UTF8);
Debug.Log("处理结束!");
}
}