Unity字节序问题
问题
Unity中有些配置信息并不想在发布之后给其他人看到,所以在打包的时候进行了简单的编码处理,然后保存为.bytes类型,读取的时候再进行解码处理。今天遇到的很奇葩的问题是:
- 如果bytes文件UTF8,Unity使用Resources.Load()后进行XML解析直接崩溃,使用不带BOM的UTF8格式就没问题。
如果文件后缀使用xml, 数据内容不变,进行上述流程就没有问题。
问题就在于BOM(Byte Order Mark)这个格式上
1.Big Endian和Little Endian
Big endian和Little endian是CPU处理多字节数的不同方式。例如“汉”字的Unicode编码是6C49。那么写到文件里时,究竟是将6C写在前面,还是将49写在前面?如果将6C写在前面,就是big endian。还是将49写在前面,就是little endian。
我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。 UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”?
2.UCS 编码
在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符”ZERO WIDTH NO-BREAK SPACE”。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符”ZERO WIDTH NO-BREAK SPACE”又被称作BOM。
UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符”ZERO WIDTH NO-BREAK SPACE”的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。
3.BOM在XML中的使用
W3C定义了三条XML解析器如何正确读取XML文件的编码的规则:
- 如果文档有BOM(字节顺序标记,一般来说,如果保存为unicode格式,则包含BOM,ANSI则无),就定义了文件编码
- 如果没有BOM,就查看XML声明的编码属性
- 如果上述两个都没有,就假定XML文挡采用UTF-8编码
也就是说Unity在读取的时候也会关注BOM的,在处理bytes的时候需要关注这个
参考
BOM
大端序与小端序
转载于:https://www.cnblogs.com/zsb517/p/6104050.html
Unity字节序问题相关推荐
- 位域 内存 字节序_JS操作内存?二进制数组了解一下
二进制数组的由来 主要是为了提高浏览器与显卡之间的通信效率,由二进制数据代替传统的文本. 二进制数组主要有三个对象: ArrayBuffer TypedArray DataView ArrayBuff ...
- Socket通信之操作系统的字节序和位数
关于Socket通信过程中字节序 在网络编程里,网络字节序是big-endian的,而大部分的PC的系统都是X86处理器系列,X86采用的是little-endian,所以需要将网络数据流转换成本地数 ...
- 位序、字节序、类型序
计算机学科中的很多问题,都是因为概念的抽象模糊,导致理解上的不确定性,增加学习领悟的难度.对于计算机中数据存放次序的问题,很多教材或文章要么含糊其辞,要么凭空飞来结论,让人看的一头雾水.几经周折,结合 ...
- 大小端以及字节序的问题
网络字节顺序NBO(Network Byte Order):按从高到低的顺序存储,在网络上使用统一的网络字节顺序,可以避免兼容性问题. The order in which the bytes of ...
- 大小端字节序介绍以及判断当前环境字节序的程序【C语言】
文章目录 1.大小端字节序介绍 2. 判断当前环境的字节序程序 1.大小端字节序介绍 首先我们先来介绍什么是大端字节序,什么是小端字节序: 大小端字节序指的是数据在电脑上存储的字节顺序 小端字节序存储 ...
- 大端模式字节序和位序以及操作
2019独角兽企业重金招聘Python工程师标准>>> 字节序:先存高字节(高字节在低地址): 位序:先存高位(高位在低地址): 也就是与我们平时的书写习惯是一致的.例如:0x123 ...
- netty websocket客户端_Websocket操作字节序 之 服务端
Websocket在JavaScript中操作字节序 之 客户端 在上一篇文章中,把页面的websocket编码写好了,那么服务端又该如何实现呢?由于该文是在上上篇demo中修改的,所以不全的代码还请 ...
- 网络字节序,主机字节序,地址转换函数
#include "../apue.h" int main(void){ //验证当前平台属哪种字节序 unsigned int x=0x12345678; unsigned ch ...
- python3 网络编程 主机字节序 网络字节序 相互转换
编写底层低层网络应用时,或许需要处理通过电缆在两台设备之间传送的低层数据.在这种操作中,需要把主机操作系统发出的数据转换成网络格式,或者做逆向转换,因为这两种数据的表示方式不一样. 1. 代码 # 主 ...
最新文章
- playbook核心元素之 -- 角色role(9)
- k8s 命令 重启_快速入门Kubernetes(K8S)——资源清单
- linux文件中链接文件系统,一种基于Linux文件系统文件链接的缓存LRU方法
- 主成分分析(PCA)matlab代码实现
- 最全的CSS浏览器兼容整理
- 软件设计原则(四) 里氏替换原则
- 计算机网页制作保存,不使用任何工具轻松保存网页资源的法子
- 射频天线设计-窄带阻抗匹配电路设计
- 在 LaTeX 中插入图片
- 2014年华为收入122亿美元
- 软件安全期末考试试题21SZ回忆版
- 安卓手机APP进行自动化点击软件详解
- 操作系统13章(个人笔记)
- JavaWeb面试(史上最全的面试介绍,文字内容可以有点枯燥,可以关注一波在慢慢看)
- php加密的是什么,看看下面这个php代码是使用什么加密的?
- 宋浩概率论与数理统计-第八章-笔记
- hex文件格式学习记录
- 2018平安科技春季校招后台开发人员面试经历
- jdk1.8、jre1.8运行环境下载安装与环境配置
- 三维空间:点到直线垂足坐标公式推导