在Unity环境中使用UTF-8编码

news2024/9/21 19:57:25

为什么要讨论这个问题

        为了避免乱码和更好的跨平台

        我刚开始开发时是使用VS开发,Unity自身默认使用UTF-8 without BOM格式,但是在Unity中创建一个脚本,使用VS打开,VS自身默认使用GB2312(它应该是对应了你电脑的window版本默认选取了国标编码,或者是因为一些其他的原因)读取脚本,默认是看不到在VS中的编码格式,下面我介绍一种简单快捷的办法让你查看你的编码格式.

d4b54063b3ba42e8857971d094ad3a83.png

点击扩展下的管理扩展

3e5b5deaa20443c49cd81aabd5c33fc1.png

下载该插件,重启VS.

c9665690dafa41fda293ce31fb705bd5.png

然后你就会发现右下角多了编码格式.

        此时如果你写了一些中文注释,并通过git或svn提交了你的代码,假设你们的团队并没讨论过编码问题,而另一个人使用了rider编码(或其他的编辑器),rider默认使用utf8,你的注释到了他那里就是乱码.

如下

681550b83fc74845b4dcb0863ba53e75.png

0c0014a597ac43598581f4b1e72e229c.png

        注意俩张图的右下角的编码,前者是国标,后者是utf8,当然rider可以很方便的转换编码,但是如果脚本多了就很麻烦,且后续仍可能出现乱码问题.

863a55ce15ba41d5956b1ec2ba17e924.png

        并且Unity自身也不支持国标2312,所以一个团队统一使用UTF-8是很有好处的,UTF-8给到国标也不会出乱码.

如何做?

          在讲通用方法之前讲一个笨办法,刚才下载了那个FileEncoding插件后,点击右下方的编码格式选择convert to utf8,但是要注意必须在脚本中写一点中文注释,或者中文字符串,就是说这个文件需要有一点中文,然后点保存,才能成功被改变.

        如果不写中文注释,当再创建一个脚本编译之后,刚才改成utf8的脚本又变回GB2312.并且这个方法需要每个脚本都改一下,有些麻烦.

下面使用一个通用办法来帮助整个团队使用统一的编码规范.

即使用.editorconfig文件

这是一个统一的规范,多数编辑器都支持这个规范.

使用办法

        在Unity根目录添加一个文本文件名字为.editorconfig(注意前面有一个点,然后删掉.txt后缀),记事本打开,粘贴下列内容.此文件放在unity的项目的根目录,或者git/svn仓库的根目录让团队所有人使用.

# 顶级 EditorConfig 文件
root = true

###############################
# 编码设置
###############################

# 所有 C# 文件使用 UTF-8 编码
[*.cs]
charset = utf-8

# JSON 文件使用 UTF-8 编码
[*.json]
charset = utf-8

# YAML 文件(Unity 场景和预制件)使用 UTF-8 编码
[*.yaml]
charset = utf-8

# Shader 文件使用 UTF-8 编码
[*.shader]
charset = utf-8

# 文本文件和其他文件使用 UTF-8 编码
[*.txt]
charset = utf-8

###############################
# 缩进和空格规则
###############################

# C# 文件使用 4 个空格缩进
[*.cs]
indent_style = space
indent_size = 4

# JSON 文件使用 2 个空格缩进
[*.json]
indent_style = space
indent_size = 2

# YAML 文件使用 2 个空格缩进
[*.yaml]
indent_style = space
indent_size = 2

# Shader 文件使用 4 个空格缩进
[*.shader]
indent_style = space
indent_size = 4

# 文本文件使用 4 个空格缩进
[*.txt]
indent_style = space
indent_size = 4


###############################
# 行尾规则
###############################

# 确保所有文件以换行符结尾
[*]
insert_final_newline = true

# 统一使用 LF 换行符(适用于跨平台项目)
[*]
end_of_line = lf

###############################
# 其他规则
###############################

# 删除行尾的多余空格
[*]
trim_trailing_whitespace = true

        重点是[*.cs] charset = utf-8这句话,其他的别的配置,根据个人需要删改,感兴趣可以搜索这个规范研究一下,这样会强制改变的.cs文件编码为utf8 无BOM(这个格式是最通用的格式,Unity也使用这个格式).文件处理好之后保存重启Unity和编辑器就OK了.

注意

        创建一个脚本用VS打开后,初始右下角还会显示GB2312,修改脚本内容并保存后自动会变为utf8,这就是editorconfig发挥了作用.

        和刚才一样这个文件需要有一点中文,然后点保存,才能成功被改变,如果不存在中文,当再创建一个脚本编译之后,刚才改成utf8的脚本又变回GB2312.当然如果脚本里面没中文,假设另一个人使用rider打开了这个脚本,即便rider默认使用utf8读取,也不会出现任何问题.

        最后不会修改没改变的脚本,即如果你导入一些国标脚本如果你没改动过它,也不会被自动改变格式.

 

.editorconfig介绍(选读)

        .editorconfig 是一个用于定义和维护项目中代码风格、文件格式和编码规则的配置文件。它主要用于确保开发团队在不同的编辑器和 IDE(集成开发环境)中能够保持一致的编码风格和文件格式,避免因个人习惯或不同开发工具的默认设置而产生的格式问题。

        .editorconfig 文件是一种简单的文本文件,通常放置在项目的根目录中。多个编辑器和 IDE,如 Visual Studio、Rider、VS Code 等,都支持读取并自动应用 .editorconfig 文件中的配置规则。

1 .editorconfig 的作用

统一代码风格:通过 .editorconfig,团队可以规定缩进、行尾符号、文件编码、命名规则等,确保所有开发人员使用统一的代码风格。

跨编辑器一致性:不同编辑器和 IDE 可能有不同的默认设置,.editorconfig 帮助跨平台、跨工具的团队在不同的开发环境中保持一致的格式。

代码质量提升:通过规定代码的格式规则,可以减少因代码风格不一致导致的代码冲突和审查意见,提高代码质量。

2 .editorconfig 文件的基本结构

        一个 .editorconfig 文件包含多个部分,每个部分控制特定类型文件的格式和编码规则。文件的结构是按键值对方式编写的,通常包含:

 

文件类型定义:使用文件路径或扩展名来定义针对哪些文件应用特定规则。

格式规则:定义缩进样式、空格、换行符、最大行长度等。

编码规则:定义文件的字符编码类型(如 UTF-8)。

        

# 这是顶级的 EditorConfig 文件,表示它是项目的根配置
root = true

# 针对所有 C# 文件的配置
[*.cs]
charset = utf-8            # 使用 UTF-8 编码
indent_style = space        # 使用空格进行缩进
indent_size = 4             # 缩进为 4 个空格
end_of_line = lf            # 使用 LF(换行符)作为行尾
insert_final_newline = true # 文件末尾插入换行符
trim_trailing_whitespace = true # 自动移除行尾的多余空格

# 针对 JSON 文件的配置
[*.json]
indent_style = space
indent_size = 2             # JSON 文件使用 2 个空格缩进

# 针对 YAML 文件的配置
[*.yaml]
indent_style = space
indent_size = 2             # YAML 文件使用 2 个空格缩进

# 针对 Markdown 文件的配置
[*.md]
max_line_length = off       # 对 Markdown 文件不限制行长度
trim_trailing_whitespace = false # 保留行尾空格

关键配置项说明

root:如果设置为 true,表示这是项目的顶级 .editorconfig 文件,后续子目录中的 .editorconfig 不会覆盖它。

 

文件类型选择器:

 

[*.cs]:匹配所有 .cs 文件。

[*.json]:匹配所有 .json 文件。

[src/**/*.cs]:匹配 src 目录下的所有 .cs 文件。

缩进规则:

 

indent_style:指定缩进使用空格还是 Tab。可选值:space 或 tab。

indent_size:指定缩进的大小(空格的数量)。

行尾规则:

 

end_of_line:指定行尾符号,常用值为 lf(Unix 风格换行符)或 crlf(Windows 风格换行符)。

insert_final_newline:是否在文件末尾强制添加一个换行符。

trim_trailing_whitespace:是否自动去除行尾的多余空格。

编码规则:

 

charset:指定文件的编码格式,常见的值有:

utf-8:无 BOM 的 UTF-8 编码。

utf-8-bom:带 BOM 的 UTF-8 编码。

utf-16be 或 utf-16le:UTF-16 编码。

latin1:Latin-1 编码。

最大行长度:

 

max_line_length:指定每行的最大字符长度,超出长度时可能会自动换行或提示。可以将其设置为 off,表示不限制行长度。

 

 

UTF8介绍(选读)

        UTF-8 是一种字符编码方式,用于表示 Unicode 字符。虽然 UTF-8 本身是一种编码,但它可以带有或不带有 BOM(字节顺序标记,Byte Order Mark),这导致我们通常会遇到两种主要的 UTF-8 变体:

1. UTF-8 without BOM(不带 BOM 的 UTF-8)

        这是标准的 UTF-8 编码,不包含 BOM 字节(即文件开头没有额外的 EF BB BF 字节)。

        BOM 是可选的,因此大多数现代工具和系统(包括网络协议、编程语言、操作系统)都默认使用 UTF-8 without BOM。

                 Unity 默认使用的是 UTF-8 without BOM,即不带 BOM 的 UTF-8 编码。这种编码方式在大多数场景下都是最佳选择,因为它避免了 BOM 可能带来的兼容性问题,特别是在处理跨平台文件或脚本时。

2. UTF-8 with BOM(带 BOM 的 UTF-8)

        这种编码方式在文件开头包含三个字节 EF BB BF,用于指示文件是以 UTF-8 编码的。这种标记的初衷是为了帮助某些系统(特别是 Windows 系统)识别文件的编码格式。

        尽管 BOM 可以帮助识别编码,但它通常会导致某些问题,特别是在跨平台应用或网络传输时,因为 BOM 会被解析为实际字符,从而导致错误。

 

如何确认和设置 Unity 文件编码为 UTF-8 without BOM

编辑器设置:

        Unity 默认会在其生成的文件(如脚本文件、文本文件等)中使用 UTF-8 without BOM,而且它的导入导出操作也依赖这种编码格式。

使用外部编辑器(如 Visual Studio、Rider 等)检查文件编码:

        打开文件时,可以通过状态栏或高级保存选项检查文件的编码格式,确保使用的是 UTF-8 without BOM。

        如果文件编码不符合预期,可以通过 高级保存选项 将文件转换为 UTF-8 without BOM(这里还是推荐我刚才讲的插件,配置起来很麻烦,感兴趣自行搜索)。

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2113757.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自己部门日均1000+告警?如何减少90%无效告警?

目录标题 一、告警的类别1.技术告警1.1基础设施告警1.2基本服务告警 2.业务告警3.监控大盘告警 二、为何需要告警治理?三、治理迫在眉睫1.1告警治理策略1.2核心监控告警点1.3避免告警反模式1.4告警规约制定1.5自动化处理 一、告警的类别 一般的告警分为以下几点&am…

ISP面试准备2

系列文章目录 文章目录 系列文章目录前言一.如何评价图像质量?二.引起图像噪声的原因三. ISP3.1 ISP Pipeline主要模块3.1.1坏点校正(Defect Pixel Correction, DPC)3.1.2黑电平校正(Black Level Correction, BLC)3.1.…

面试官:synchronized的锁升级过程是怎样的?

大家好,我是大明哥,一个专注「死磕 Java」系列创作的硬核程序员。 回答 在 JDK 1.6之前,synchronized 是一个重量级、效率比较低下的锁,但是在JDK 1.6后,JVM 为了提高锁的获取与释放效,,对 synchronized 进…

基于JSP的实验室管理系统

你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:JSP技术 Spring Boot框架 工具:IDEA/Eclipse、Navicat、Tomcat 系统展示 首页 用户个…

自然语言处理系列六十二》神经网络算法》MLP多层感知机算法

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列六十二神经网络算法》MLP多层感知机算法CNN卷积…

【Python篇】PyQt5 超详细教程——由入门到精通(序篇)

文章目录 PyQt5 超详细入门级教程前言序篇:1-3部分:PyQt5基础与常用控件第1部分:初识 PyQt5 和安装1.1 什么是 PyQt5?1.2 在 PyCharm 中安装 PyQt51.3 在 PyCharm 中编写第一个 PyQt5 应用程序1.4 代码详细解释1.5 在 PyCharm 中运…

电子电气架构---私有总线通信和诊断规则

电子电气架构—私有总线通信和诊断规则 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自…

最新版 | SpringBoot3如何自定义starter(面试常考)

文章目录 一、自定义starter介绍二、自定义Starter的好处及优势三、自定义starter应用场景四、自定义starter1、创建autoconfigure的maven工程2、创建starter的maven工程3、在autoconfigure的pom文件中引入MyBatis的所需依赖4、编写自动配置类MyBatisAutoConfiguration5、编写i…

红旗EQM换电连接器哪家生产

红旗EQM换电连接器概述 红旗EQM换电连接器是针对红旗品牌电动汽车设计的一种快速更换电池的装置。它允许用户在短时间内完成电池的更换,从而提高电动车的使用效率和便捷性。接下来,我们将详细探讨红旗EQM换电连接器的相关操作步骤、所需工具以及最新的相…

[Git使用] 实战技巧

文章目录 1. 理解分叉点2. Rebase3. FixUp4. Revert1. 理解分叉点 合并分支的时候会产生分叉点 比如: 仓库有dev和feature两个分支; 操作1:dev远程新建一个文件操作2:feature提交第一次操作3:远程执行把feture合并到dev分支在可视化界面可以看到 远程Dev分支的可视化: …

MySQL 锁分类有哪些?一文带你详解!!

MySQL 锁 全局锁全局锁的应用场景全局锁的缺点 表级锁表锁元数据(MDL)锁MDL 锁的问题 意向锁AUTO-INC 锁 行级锁记录锁(Record Lock)间隙锁(Gap Lock)临键锁(Next-Key Lock)插入意向…

安卓开发板_联发科MTK开发评估套件串口调试

串口调试 如果正在进行lk(little kernel ) 或内核开发,USB 串口适配器( USB 转串口 TTL 适配器的简称)对于检查系统启动日志非常有用,特别是在没有图形桌面显示的情况下。 1.选购适配器 常用的许多 USB 转串口的适配器&#xf…

宝塔部署Vue项目解决跨域问题

一、前言 使用宝塔面板部署前端后端项目相比用命令行进行部署要简单许多,宝塔的可视化操作对那些对Linux不熟悉的人很友好。使用宝塔部署SpringBoot后端项目和Vue前端项目的方法如下: 1、视频教程 2、文字教程1 3、文字教程2 以上的教程完全可以按照步骤…

以太网交换机工作原理学习笔记

在网络中传输数据时需要遵循一些标准,以太网协议定义了数据帧在以太网上的传输标准,了解以太网协议是充分理解数据链路层通信的基础。以太网交换机是实现数据链路层通信的主要设备,了解以太网交换机的工作原理也是十分必要的。 1、以太网协议…

SQLException: No Suitable Driver Found - 完美解决方法详解

🚨 SQLException: No Suitable Driver Found - 完美解决方法详解 🚨 **🚨 SQLException: No Suitable Driver Found - 完美解决方法详解 🚨****摘要 📝****引言 🎯****正文 📚****1. 问题概述 ❗…

网络层 VII(IP多播、移动IP)【★★★★★★】

一、IP 多播 1. 多播的概念 多播是让源主机一次发送的单个分组可以抵达用一个组地址标识的若干目的主机,即一对多的通信。在互联网上进行的多播,称为 IP 多播(multicast , 以前曾译为组播)。 与单播相比,在一对多的…

【go】内存分配模型

内存是怎么分配给对象的? 内存分配优化的地方是? 讲讲golang内存分配模型? ans: 1.按照对象的大小分配:先算出对象的大小如果是tiny对象,就从tiny block中获取地址和偏移量,将对象打包到mcache;如果是16B以…

Xilinx系FPGA学习笔记(五)ROM的IP核学习

系列文章目录 文章目录 系列文章目录前言ROM IP分布式ROM生成ROM配置创建COE文件 块ROM生成如何快速生成Example Design 两种ROM对比 前言 最近在学习小梅哥的xilinx型FPGA开发板,一边学习一边记录,简化整理一下笔记 ROM IP 在 Memories &Storage …

JVM、JRE和 JDK:理解Java开发的三大核心组件

Java是一门跨平台的编程语言,它的成功离不开背后强大的运行环境与开发工具的支持。在Java的生态中,JVM(Java虚拟机)、JRE(Java运行时环境)和JDK(Java开发工具包)是三个至关重要的核心…

致远个性化之--获取明细表中相同类型的数据汇总,并赋值对应明细行中

需求 由于在近期的项目中,有预算、费用管控等需求,而且在报销填报时,费用明细项可能会有重复相同的费用类型发生多项,而相同的费用类型是多项时,要求按照汇总后的费用管控。 具体示例图如下: 邮寄费发生了两…