zoukankan      html  css  js  c++  java
  • Unity字节序问题

    问题

    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

    大端序与小端序

  • 相关阅读:
    微信小程序view标签以及display:flex的测试
    微信小程序简单入门理解
    spring+mybatis的简单配置示例
    反链与外链的区别汇总
    隐性URL与显性URL区别与SEO考虑
    你是如何为公司死心塌地卖命的?
    大三下学期十七周总结
    IP地址、子网掩码、网络号、主机号、网络地址、主机地址、IP段/数字
    大三下学期十六周总结
    图解高内聚与低耦合
  • 原文地址:https://www.cnblogs.com/zsb517/p/6104050.html
Copyright © 2011-2022 走看看