日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Unity拓展工具】批量更改脚本文件的编码格式 (unity中脚本文件的编码格式从ANSI转换到UTF8出现乱码)

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Unity拓展工具】批量更改脚本文件的编码格式 (unity中脚本文件的编码格式从ANSI转换到UTF8出现乱码) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

提示:記錄點學習過程中的簡單成果,方便日后回顧也希望對讀者有點小幫助

文章目錄

  • 前言
  • 一、實現思路
  • 二、基礎知識
    • 1.編碼格式
    • 2.Unity腳本轉碼注意事項
  • 三、具體代碼實現
  • 參考鏈接
  • 總結


前言

在一些游戲項目中,有的項目或許屬于前期的某種設計缺陷導致沒有string表,需要在腳本文件中寫漢字。這樣操作一般是不允許的,是因為在代碼中寫漢字容易因為文件編碼的問題導致在真機包出現錯誤。由于文件的累積最后需要更改腳本文件的數量甚是龐大,需要消耗大量時間,于是自己第一次學習寫了這個拓展工具。


一、實現思路

主要是需要先找到我們想要的更改編碼的文件,判斷編碼當前的編碼格式是否是我們目標編碼格式,不一致就需要進行更改。

二、基礎知識

1.編碼格式

編碼格式解釋
ASCIIASCII全名是American Standard Code for Information Interchange, 叫做“美國信息交換標準碼”。ASCII碼中,一個英文字母(不分大小寫)占一個字節的空間,一個中文漢字占兩個字節的空間。ASCII碼是目前最普及的一種字符編碼。
ANSIANSI編碼是一種對ASCII碼的拓展:ANSI編碼用0x00~0x7f (即十進制下的0到127)范圍的1 個字節來表示 1 個英文字符,超出一個字節的 0x80~0xFFFF 范圍來表示其他語言的其他字符。也就是說,ANSI碼僅在前128(0-127)個與ASCII碼相同,之后的字符全是某個國家語言的所有字符。
UnicodeASCII碼叫做“美國信息交換標準碼”,一個英文字母(不分大小寫)占一個字節的空間,一個中文漢字占兩個字節的空間。ASCII碼是目前最普及的一種字符編碼,只適用于美帝,要是用在美帝之外的國家,就不能滿足需求了。還有ANSI編碼其實包括很多編碼:中國制定了GB2312編碼,用來把中文編進去另外,日本把日文編到Shift_JIS里,韓國把韓文編到Euc-kr里,各國有各國的標準。受制于當時的條件,不同語言之間的ANSI碼之間不能互相轉換,這就會導致在多語言混合的文本中會有亂碼。
UTF8為了解決不同國家ANSI編碼的沖突問題,Unicode應運而生:如果全世界每一個符號都給予一個獨一無二的編碼,那么亂碼問題就會消失。這就是Unicode,就像它的名字都表示的,這是一種所有符號的編碼。Unicode標準也在不斷發展,但最常用的是用兩個字節表示一個字符(如果要用到非常偏僻的字符,就需要4個字節)。現代操作系統和大多數編程語言都直接支持Unicode。但是問題在于,原本可以用一個字節存儲的英文字母在Unicode里面必須存兩個字節(規則就是在原來英文字母對應ASCII碼前面補0),這就產生了浪費。那么有沒有一種既能消除亂碼,又能避免浪費的編碼方式呢?答案就是UTF-8!

2.Unity腳本轉碼注意事項

Unity腳本文件在轉碼的時候我們需要先去讀取文件的文本內容,然后再去將讀到的內容使用UTF8的編碼格式寫入文件。值得注意的是這里面如果是因為中文亂碼的話就可以使用Encoding.GetEncoding(“Gb3212”)的編碼格式去讀,否則你讀到的本身就是亂碼,那么重新寫入也只會是亂碼。


三、具體代碼實現

using Sirenix.OdinInspector.Editor; using UnityEngine; using System.IO; using UnityEditor; using System.Text; using System;namespace Game.Editor {public class UTF_8 : OdinEditorWindow{private string Path = "Assets/Code/Game@hotfix/Window";private string Result;private string Finish;private int FileCount;private int ChangeCount;private Vector2 scrollPos;[MenuItem("Tools/UTF-8編碼", false)]public static void Open(){var window = (UTF_8)EditorWindow.GetWindow(typeof(UTF_8), false, "UTF-8編碼");window.maxSize = window.minSize = new Vector2(400, 400);window.Show();}private void OnGUI(){scrollPos = GUILayout.BeginScrollView(scrollPos);{GUILayout.BeginVertical();{GUILayout.Space(20);GUILayout.BeginHorizontal();{GUILayout.Label("File_Path");GUILayout.FlexibleSpace();Path = GUILayout.TextField(Path, GUILayout.Width(300));}GUILayout.EndHorizontal();GUILayout.Space(10);GUILayout.Space(30);if (GUILayout.Button("生成")){FileCount = 0;ChangeCount = 0;GetAllFile();}if (GUILayout.Button("清空log")){Clear();}GUILayout.Space(30);GUILayout.Label(Finish);GUILayout.Space(10);GUILayout.Label(Result);}GUILayout.EndVertical();}GUILayout.EndScrollView();}private void GetAllFile(){if (Path == null || Path == ""){Result = "路徑不可以為null";}//獲取指定路徑下面的所有資源文件 if (Directory.Exists(Path)){DirectoryInfo direction = new DirectoryInfo(Path);FileInfo[] files = direction.GetFiles("*", SearchOption.AllDirectories);for (int i = 0; i < files.Length; i++){if (files[i].Name.EndsWith(".meta")){continue;}Encoding _encoding = GetType(files[i].OpenRead());if (_encoding != Encoding.UTF8){var s = File.ReadAllText(files[i].FullName, Encoding.GetEncoding("GB2312"));File.WriteAllText(files[i].FullName, s, new UTF8Encoding(false));ChangeCount++;}FileCount++;}Result = $"總共找到{FileCount}個cs文件 {ChangeCount}個cs文件的編碼格式被修改成了UTF-8";Finish = "完成";}else{Result = "未找到此路徑";}}private static System.Text.Encoding GetType(FileStream fs){byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 };byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 };byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //帶BOMEncoding reVal = Encoding.Default;BinaryReader r = new BinaryReader(fs, System.Text.Encoding.Default);int i;int.TryParse(fs.Length.ToString(), out i);byte[] ss = r.ReadBytes(i);if (IsUTF8Bytes(ss) || (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF)){reVal = Encoding.UTF8;}else if (ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00){reVal = Encoding.BigEndianUnicode;}else if (ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41){reVal = Encoding.Unicode;}r.Close();return reVal;}/// <summary>/// 判斷是否是不帶 BOM 的 UTF8 格式/// </summary>/// <param name="data"></param>/// <returns></returns>private static bool IsUTF8Bytes(byte[] data){int charByteCounter = 1;//計算當前正分析的字符應還有的字節數byte curByte; //當前分析的字節.for (int i = 0; i < data.Length; i++){curByte = data[i];if (charByteCounter == 1){if (curByte >= 0x80){//判斷當前while (((curByte <<= 1) & 0x80) != 0){charByteCounter++;}//標記位首位若為非0 則至少以2個1開始 如:110XXXXX...........1111110Xif (charByteCounter == 1 || charByteCounter > 6){return false;}}}else{//若是UTF-8 此時第一位必須為1if ((curByte & 0xC0) != 0x80){return false;}charByteCounter--;}}if (charByteCounter > 1){throw new Exception("非預期的byte格式");}return true;}private void Clear(){Result = null;Finish = null;}} }

參考鏈接

鏈接: 字符編碼ANSI和ASCII區別、Unicode和UTF-8區別

總結

如果有大佬看到還望指點一二!!!

總結

以上是生活随笔為你收集整理的【Unity拓展工具】批量更改脚本文件的编码格式 (unity中脚本文件的编码格式从ANSI转换到UTF8出现乱码)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。