BOM-字节序标记

BOM——Byte Order Mark 字节序标记

  首先是什么是字节序? 字节序:与二进制数据在机器存放位置相关的! 可分为两类:

    1. 小端字节序: 低地址放低位数据。 x86系列的计算机就使用这种字节序

    2. 大端字节序: 低地址放高位数据。 ibm系使用

举个例子..  写个简单程序来看看自己电脑使用神马字节序存放数据的!

#include <stdio.h>

int main(int argc, char const *argv[])
{
    FILE *fp = NULL;
    int data = 109034;    // 1A9EA
    if((fp = fopen("m.data", "wb+")) != NULL) {
        fwrite(&data, sizeof(int), 1, fp);
    }
    fclose(fp);
    return 0;
}

  使用16进制编辑器(Nodepad++安装个HexEditor即可) 查看程序生成的m.data文件!

  结果如下:   从左到右地址递增

    ea a9 01 00

  可以看出: data变量的ea字节存放在m.data低位字节, 因此本身的机器使用小字节序存放数据。

  

回到正题, UTF-8编码本身是不需要使用BOM来表明字节顺序,但可以用BOM来表明编码方式。也就是告诉编辑器知道它是个utf-8之外什么用处都没有。带BOM文件特征:以 EF BB BF开头

BOM本是为 UTF-16 和 UTF-32 准备的,用于标记字节序。  对于多系统(多语言)使用者来说, 带BOM的UTF-8简直就是一场灾难。可以参考:UTF8最好不要带BOM,附许多经典评论

另外:   检测文件编码这个功能看着容易,实际很难! 就举个最最简单的例子: 创建一个信息量很小的gbk编码的文件,内容就一字: “键” 。

  1. 使用nodepad++打开虽然没乱码,但是右下角没ANSI编码

  2. 使用sublime text 3(带ConvertToUTF8插件)打开, 结果是乱码

  3. 使用python的chardet库来查看文件的编码, 结果输出: {‘confidence‘: 0.73, ‘encoding‘: ‘windows-1252‘}

So, 在项目中一定要统一文件的编码! 这至关重要

  

时间: 2024-10-06 00:46:41

BOM-字节序标记的相关文章

刨根究底字符编码之十一——UTF-8编码方式与字节序标记

UTF-8编码方式与字节序标记 一.UTF-8编码方式 1. 接下来将分别介绍Unicode字符集的三种编码方式:UTF-8.UTF-16.UTF-32.这里先介绍应用最为广泛的UTF-8. 为满足基于ASCII.面向字节的字符处理的需要,Unicode标准中定义了UTF-8编码方式.UTF-8应该是目前应用最广泛的一种Unicode编码方式(但不是最早面世的,UTF-16要早于UTF-8面世).它是一种使用8位码元(即单字节码元)的变宽(即变长或不定长)码元序列的编码方式. 由于UTF-16对

UTF的字节序和BOM

UTF的字节序和BOM UTF-8UTF的字节序和BOM以字节为编码单元,没有字节序的问题.UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序.例如收到一个"奎"的Unicode编码是594E,"乙"的Unicode编码是4E59.如果我们收到UTF-16字节流"594E",那么这是"奎"还是"乙"? Unicode规范中推荐的标记字节顺序的方法是BOM.BOM

字节顺序标记——BOM,Byte Order Mark

定义 BOM(Byte Order Mark),字节顺序标记,出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的编码. 介绍 UTF-8 不需要 BOM,尽管 Unicode 标准允许在 UTF-8 中使用 BOM.但不含 BOM 的 UTF-8 才是标准形式,在 UTF-8 文件中放置 BOM 主要是微软的习惯(顺便提一下:把带有 BOM 的小端序 UTF-16 称作「Unicode」而又不详细说明,这也是微软的习惯). 「UTF-8」和「带 BOM 的 UTF-8」的区

linux: 讨论一下网络字节序--------大端与小端的差别

数据存储优先顺序的转换 计算机数据存储有两种字节优先顺序:高位字节优先(称为大端模式)和低位字节优先(称为小端模式).内存的低地址存储数据的低字节,高地址存储数据的高字节的方式叫小端模式.内存的高地址存储数据的低字节,低地址存储数据高字节的方式称为大端模式. eg:对于内存中存放的数0x12345678来说(注意,对于数据而言,此处12是高字节,78是低字节:对于地址而言,左边是低地址,右边是高地址) 如果是采用大端模式存放的,则其真实的数是:0x12345678 如果是采用小端模式存放的,则其

理解字节序 [Understanding Big and Little Endian Byte Order]

原文地址 (本文对于字节序讲解的很清楚,容易理解.) Problems with byte order are frustrating, and I want to spare you the grief I experienced. Here's the key: Problem: Computers speak different languages, like people. Some write data "left-to-right" and others "rig

“字节序”是个什么鬼?

“字节序”是个什么鬼? http://mp.weixin.qq.com/s?__biz=MjM5NTU2MTQwNA==&mid=2650652324&idx=1&sn=5502d3ab977b9894f50592266544b30c&scene=0 大端.小端引发的思考.论顺序的重要性1.做饭的故事今天女朋友加班,机智的她早已在昨晚准备好食材,回家只需下锅便可.谁知开会就是个无底洞,到了B1,还有B2,无穷匮也.辛苦如她,为了能让她一回家就吃上热腾腾的饭菜,我准备亲自下厨

字节序转换与结构体位域(bit field)值的读取

最近又遇到了几年前遇到的问题,标记一下. 对于跨字节位域(bit field)而言,如果数据传输前后环境的字节序不同(LE->BE,BE->LE),简单地调用(ntohs/ntohl/htons/htonl)并不能正确读取位域的值. 例如: struct _exam_ { unsigned int tag : 6; unsigned int field1 : 3; unsigned int field2 : 7; unsigned int field3 : 11; unsigned int p

字节序转换与结构体位域(bit field)值的读取 Part 2 - 深入理解字节序和结构体位域存储方式

上一篇文章讲解了带位域的结构体,在从大端机(Big Endian)传输到小端机(Little Endian)后如何解析位域值.下面继续深入详解字节序,以及位域存储的方式. (1) 我们知道,存储数字时,对小端机而言,数字的低位,存在低地址,高位存在高地址.大端机正相反. (2) 读取的方式,也是一样的.对于小端机,读出的低地址位作为数字的低位. (3) 此外Big-Endian/Little-Endian存储顺序,不仅仅针对字节,还针对字节内的比特位.对于小端机而言,字节内的8个比特,低地址端比

字节序

1.什么是字节序 字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序.由于数据在内存中存储的顺序与操作系统有关,因此字节在主机中的存储顺序通常称为主机序:而数据在网络中的存储顺序则称为网络序. 常见的字节序有:大端字节序(Big endian)与小端字节序(Little endian). 主机序依CPU而定:Intel x86为Little endian,Motorola680x则是Big endian. 网络序与CPU无关都是Big endian, 这是因为统一字节序有利于数