问题

Unity中有些配置信息并不想在发布之后给其他人看到,所以在打包的时候进行了简单的编码处理,然后保存为.bytes类型,读取的时候再进行解码处理。今天遇到的很奇葩的问题是:

  1. 如果bytes文件UTF8,Unity使用Resources.Load()后进行XML解析直接崩溃,使用不带BOM的UTF8格式就没问题。
  2. 如果文件后缀使用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文件的编码的规则:

  1. 如果文档有BOM(字节顺序标记,一般来说,如果保存为unicode格式,则包含BOM,ANSI则无),就定义了文件编码
  2. 如果没有BOM,就查看XML声明的编码属性
  3. 如果上述两个都没有,就假定XML文挡采用UTF-8编码

也就是说Unity在读取的时候也会关注BOM的,在处理bytes的时候需要关注这个

参考

BOM

大端序与小端序

转载于:https://www.cnblogs.com/zsb517/p/6104050.html

Unity字节序问题相关推荐

  1. 位域 内存 字节序_JS操作内存?二进制数组了解一下

    二进制数组的由来 主要是为了提高浏览器与显卡之间的通信效率,由二进制数据代替传统的文本. 二进制数组主要有三个对象: ArrayBuffer TypedArray DataView ArrayBuff ...

  2. Socket通信之操作系统的字节序和位数

    关于Socket通信过程中字节序 在网络编程里,网络字节序是big-endian的,而大部分的PC的系统都是X86处理器系列,X86采用的是little-endian,所以需要将网络数据流转换成本地数 ...

  3. 位序、字节序、类型序

    计算机学科中的很多问题,都是因为概念的抽象模糊,导致理解上的不确定性,增加学习领悟的难度.对于计算机中数据存放次序的问题,很多教材或文章要么含糊其辞,要么凭空飞来结论,让人看的一头雾水.几经周折,结合 ...

  4. 大小端以及字节序的问题

    网络字节顺序NBO(Network Byte Order):按从高到低的顺序存储,在网络上使用统一的网络字节顺序,可以避免兼容性问题. The order in which the bytes of ...

  5. 大小端字节序介绍以及判断当前环境字节序的程序【C语言】

    文章目录 1.大小端字节序介绍 2. 判断当前环境的字节序程序 1.大小端字节序介绍 首先我们先来介绍什么是大端字节序,什么是小端字节序: 大小端字节序指的是数据在电脑上存储的字节顺序 小端字节序存储 ...

  6. 大端模式字节序和位序以及操作

    2019独角兽企业重金招聘Python工程师标准>>> 字节序:先存高字节(高字节在低地址): 位序:先存高位(高位在低地址): 也就是与我们平时的书写习惯是一致的.例如:0x123 ...

  7. netty websocket客户端_Websocket操作字节序 之 服务端

    Websocket在JavaScript中操作字节序 之 客户端 在上一篇文章中,把页面的websocket编码写好了,那么服务端又该如何实现呢?由于该文是在上上篇demo中修改的,所以不全的代码还请 ...

  8. 网络字节序,主机字节序,地址转换函数

    #include "../apue.h" int main(void){ //验证当前平台属哪种字节序 unsigned int x=0x12345678; unsigned ch ...

  9. python3 网络编程 主机字节序 网络字节序 相互转换

    编写底层低层网络应用时,或许需要处理通过电缆在两台设备之间传送的低层数据.在这种操作中,需要把主机操作系统发出的数据转换成网络格式,或者做逆向转换,因为这两种数据的表示方式不一样. 1. 代码 # 主 ...

最新文章

  1. playbook核心元素之 -- 角色role(9)
  2. k8s 命令 重启_快速入门Kubernetes(K8S)——资源清单
  3. linux文件中链接文件系统,一种基于Linux文件系统文件链接的缓存LRU方法
  4. 主成分分析(PCA)matlab代码实现
  5. 最全的CSS浏览器兼容整理
  6. 软件设计原则(四) 里氏替换原则
  7. 计算机网页制作保存,不使用任何工具轻松保存网页资源的法子
  8. 射频天线设计-窄带阻抗匹配电路设计
  9. 在 LaTeX 中插入图片
  10. 2014年华为收入122亿美元
  11. 软件安全期末考试试题21SZ回忆版
  12. 安卓手机APP进行自动化点击软件详解
  13. 操作系统13章(个人笔记)
  14. JavaWeb面试(史上最全的面试介绍,文字内容可以有点枯燥,可以关注一波在慢慢看)
  15. php加密的是什么,看看下面这个php代码是使用什么加密的?
  16. 宋浩概率论与数理统计-第八章-笔记
  17. hex文件格式学习记录
  18. 2018平安科技春季校招后台开发人员面试经历
  19. jdk1.8、jre1.8运行环境下载安装与环境配置
  20. 三维空间:点到直线垂足坐标公式推导

热门文章

  1. VB 在浏览器中打开指定网址
  2. Erlang之父Joe Armstrong去世
  3. 图像标注,三倍加速:谷歌AI新方案,数据民工的福音 | Demo可玩耍
  4. 打字方式异于常人,可能脑子有病丨AI研究
  5. 走美团特色的无人配送道路,王慧文:久久为功才能做成
  6. 纯新手入门机器/深度学习自学指南(附一个月速成方案)
  7. 砸115亿元入局!后知后觉的欧洲重金建设AI,为赶中超美
  8. React学习笔记—属性转移
  9. [转]简析 IOS 程序图标的设计
  10. C# DEV 树、Grid、下拉框等设定数据源对比