原理很简单,因为gb2312/gbk是中文两字节,这两个字节是有取值范围的,而utf-8中汉字是三字节,同样每个字节也有取值范围。而英文不 管在何种编码情况下,都是小于128,只占用一个字节(全角除外)。
如果是文件形式的编码检查,还可以直接check utf-8的bom信息。话不多说,直接上函数,这个函数是用来对字符串进行检查和转码的。
关于bom 字节顺序记号(英:byte-order mark,bom)是位于码点 u+feff 的统一码字符(零宽度无断空白)。当以 utf-16 或 utf-32 来将ucs/统一码字符所组成的字串编码时,这个字符被用来标示其字节序。它常被用来当做标示文件是以 utf-8 、 utf-16 或 utf-32 编码的记号。
在大部分的字符编码中,字节顺序记号是一个不太可能出现在其它文件的样式(它通常看起来像是一个混淆的控制码的序列)。如果字节顺序记号被误解成统一码文件中真正的字符时,那么它将不可视,因为它是零宽度无断空白。在 unicode3.2 中, u+feff 用于非字节顺序记号的用途已被舍弃(取而代之的是,使用 u+2060 来表示这种用途),以容许 u+feff 仅被地用于字节顺序记号的语意。
在 utf-16 中,字节顺序记号被放置为档案或字符串流的第一个字符,以标示在此档案或字符串流中,以所有十六位元为单位的字码的尾序(字节顺序)。
如果十六位元单位被表示成大尾序,这字节顺序记号字符在序列中将呈现 0xfe ,其后跟着 0xff(其中的 0x 用来标示十六进制)。 如果十六位元单位使用小尾序,这个字节序列为 0xff ,其后接着0xfe。 而统一码中,值为u+fffe 的码位被保证将不会被指定成一个统一码字符。这意味着 0xff 、 0xfe 将只能被解释成小尾序中的u+feff(因为不可能是大尾序中的 u+fffe )。
utf-8 则没有字节顺序的议题。utf-8编码过的字节顺序记号则被用来标示它是 utf-8 的文件。它只用来标示一个 utf-8 的档案,而不用来说明字节顺序。[1] 许多 视窗 程式(包含记事本)会添加字节顺序记号到 utf-8 档案。然而,在 类unix系统 系统(大量使用 en:text file ,用于 档案格式 ,用于行程间通讯)中,这种作法则不被建议采用。因为它会妨碍到如解译器脚本开头的 en:shebang 等的一些重要的码的正确处理。它亦会影响到无法识别它的编程语言。如 gcc 会报告源码档开头有无法识别的字符。而在 php 中,如果没有启用输出缓冲(output buffering),它会使得页面内容开始被送往浏览器(即:用户标头档已被送出),这使 php 脚本无法指定用户标头档(http header)。字节顺序记号在 utf-8 中被表示为序列 ef bb bf,对大部分未准备好处理 utf-8 的 文本编辑器 及 网页浏览器 而言,在 iso-8859-1 的环境中则会显示 ? 。
虽然字节顺序记号亦可以用于 utf-32 ,但这个编码很少用于传输,其规则如同 utf-16 。对于已于iana注册的字符集 utf-16be、utf-16le 、 utf-32be 和 utf-32le 等来说,不可使用字节顺序记号。文档开头的 u+feff 会被解释成一个(已舍弃的)零宽度无断空白,因为这些字符集的名字已决定了其字节顺序。对于已注册字符集 utf-16 和 utf-32 来说,一个开头的 u+feff 则用来表示字节顺序。
http://www.bkjia.com/phpjc/752415.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/752415.htmltecharticle原理很简单,因为gb2312/gbk是中文两字节,这两个字节是有取值范围的,而utf-8中汉字是三字节,同样每个字节也有取值范围。而英文不 管在...