PHP判断字符集并转码的函数
2012-09-13 14:01
218 查看
<?php function safeEncoding($string,$outEncoding ='UTF-8') { $encoding = "UTF-8"; for($i=0;$i<strlen($string);$i++) { if(ord($string{$i})<128) continue; if((ord($string{$i})&224)==224) { //第一个字节判断通过 $char = $string{++$i}; if((ord($char)&128)==128) { //第二个字节判断通过 $char = $string{++$i}; if((ord($char)&128)==128) { $encoding = "UTF-8"; break; } } } if((ord($string{$i})&192)==192) { //第一个字节判断通过 $char = $string{++$i}; if((ord($char)&128)==128) { // 第二个字节判断通过 $encoding = "GB2312"; break; } } } if(strtoupper($encoding) == strtoupper($outEncoding)) return $string; else return iconv($encoding,$outEncoding,$string); } ?>
原理很简单,因为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 则用来表示字节顺序。
相关文章推荐
- PHP自动判断字符集并转码
- PHP自动判断字符集并转码
- PHP自动判断字符集并转码
- 关于PHP自动判断字符集并转码的详解
- PHP自动判断字符集并转码的实例参考
- PHP自动判断字符集并转码
- 关于PHP自动判断字符集并转码的详解
- PHP自动判断字符集并转码的方法
- php 字符安全转码为UTF-8 的函数,转换前做判断
- PHP 版本判断 VERSION_COMPARE() 函数
- 函数:PHP将字符串从GBK转换为UTF8字符集iconv
- 介绍一些PHP判断变量的函数
- php里的unpack函数判断上传文件的类型
- 函数:PHP将字符串从GBK转换为UTF8字符集iconv
- PHP判断某个数组中是否存在指定的key,函数array_key_exists()
- php的date()函数判断今天是星期几
- PHP 判断常量,变量和函数是否存在
- php判断类是否存在函数 class_exists
- 判断PHP的exec函数是否执行成功
- (PHP实现剑指offer)在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。