ASCII: ASCII的编码范围为0-127(十六进制:0x00-0x7F),判断函数:

function isasciistr($str){
for($i=0;$i<strlen($str);$i++){
if(ord(substr($str,$i,1))>0x7F) return false;
}
return true;
}

ISO-8859-1:也称Latin1。编码范围是0-255(0x00-0xFF)。0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号,判断函数:

因为ISO-8859-1的范围中包含了0xC2-0xDF以及0x80-0xBF,而UTF-8的两、三、四字节中都可能出现在这些范围。所以,有可能将ISO-8859-1错判断为UTF-8,一般需要指定顺序,在两者都符合的情况下,顺序优先。

function islatin1str($str,$order=''){
if(empty($order)) $order = array('ASCII','UTF-8','ISO-8859-1'); $cs = ['ASCII'=>'isasciistr','GB2312'=>'isgb2312str','GBK'=>'isgbkstr','UTF-8'=>'isutf8str']; $flags = [];
$charset = false;
$other = [];
for($i=0;$i<count($order);$i++){
$ofun = NULL;
if($order[$i]!='ISO-8859-1' && $order[$i]!='WINDOWS-1252'){
$ofun = $cs[$order[$i]];
if(!empty($ofun)){
$charset = $order[$i]=='UTF-8' ? call_user_func_array("$ofun",array($str,true)): call_user_func("$ofun",$str);
if($charset){
$other[] = $order[$i];
}
} }
} $flag = true;
$N = count($other);
if($N>0){
for($k=0;$k<$N;$k++){
if(array_search('ISO-8859-1',$order)!==false){
if(array_search($other[$k],$order)<array_search('ISO-8859-1',$order)){
return false;
}
}
}
} return true; }

判断是否ISO-8859-1的函数中利用到了其它几个判断函数(见下边),分别是isasciistr()、isgb2312str()、isgbkstr()、isutf8str()。

GB2312:简体中文编码,范围是0xA1A1-0xFEFE(汉字所在编码范围为B0A1-F7FE)。判断函数如下:

function isgb2312str($str){
$len = strlen($str);
for($i=0;$i<$len;$i++){
$c1 = substr($str,$i,1);
if(ord($c1)<=0x7F) continue;
$flag1 = ord($c1)>=0xA1 && ord($c1)<=0xFE;
if(!$flag1 || $i==$len-1) return false;
$c2 = substr($str,$i+1,1);
$flag2 = ord($c2)>=0xA1 || ord($c2)<=0xFE;
if(!$flag2) return false;
$i++;
} return true;
}

GBK:在GB2312基础上扩展的编码,范围是0x8140-0xFEFE。判断函数如下:

function isgbkstr($str){
$len = strlen($str);
for($i=0;$i<$len;$i++){
$c1 = substr($str,$i,1);
if(ord($c1)<=0x7F) continue;
$flag1 = ord($c1)>=0x81 && ord($c1)<=0xFE;
if(!$flag1 || $i==$len-1) return false;
$c2 = substr($str,$i+1,1);
$flag2 = ord($c2)>=0x81 || ord($c2)<=0xFE;
if(!$flag2) return false;
$i++;
} return true;
}

UTF-8:这是可变长(一字节,两字节,三字节,四字节,五字节,六字节)的编码。通常只处理到四个字节的编码,由于部分编码范围可能与GBK非汉字部分重叠(网上很多版本都不太准确),需要处理一下,判断如下:

function isutf8str($str,$utf8all2bits=false){
$bit2 = true;
$bit3 = false;
$bit4 = false;
$allCN = array();
$len = strlen($str);
for($i=0;$i<$len;$i++){
$c1 = substr($str,$i,1);
if(ord($c1)<=0x7F) continue;
if(ord($c1)>=0xFF) return false;
$flag1_2 = ord($c1)>=0xc0 && ord($c1)<=0xdf;
$flag1_3 = ord($c1)>=0xe0 && ord($c1)<=0xef;
$flag1_4 = ord($c1)>=0xf0 && ord($c1)<=0xf7;
if(!($flag1_2 || $flag1_3 || $flag1_4) || $i==$len-1) return false;
$c2 = substr($str,$i+1,1); $flag2 = ord($c2)>=0x80 && ord($c2)<=0xbf;
if(!$flag2) return false;
if($flag1_2){
$bit2 = true;
$allCN[] = (ord($c1)>=0xB0 && ord($c1)<=0xF7 && ord($c2)>=0xA1 && ord($c2)<=0xFE) ? 1 : 0; if($i==$len-2) {if($bit3 || $bit4) return true;
$N = count($allCN);
if($N>0){
for($n=0;$n<$N;$n++){
if($allCN[$n]!=1){
return true;
}
}
}
return $utf8all2bits;
}
$i=$i+1;
}else{
if($i==$len-2) return false;
$c3 = substr($str,$i+2,1);
$flag3 = ord($c3)>=0x80 && ord($c3)<=0xbf;
if(!$flag3) return false;
if($flag1_3){
$bit3 = true;
if($bit2 || $bit4 || $i==$len-3) return true;
$i=$i+2;
}else{
$bit4 = true;
if($i==$len-3) return false;
$c4 = substr($str,$i+3,1);
$flag4 = ord($c4)>=0x80 && ord($c4)<=0xbf;
if(!$flag4) return false;
if($bit2 || $bit3 || $i==$len-4) return true;
$i=$i+3;
}
}
} return true;
}

以上各种编码也可以使用mb_detect_encoding()来处理,不过需要注意顺序:

function isasciistr($str){
return in_array(mb_detect_encoding($str,array('ASCII','GB2312','GBK','UTF-8','ISO-8859-1')),['ASCII','ISO-646']);
}

function islatin1str($str){
return in_array(mb_detect_encoding($str,array('ASCII','GB2312','GBK','UTF-8','ISO-8859-1')),['Latin1','ISO-8859-1']);
}

function isgb2312str($str){
return in_array(mb_detect_encoding($str,array('ASCII','GB2312','GBK','UTF-8','ISO-8859-1')),['GB2312','EUC-CN']);
}

function isgbkstr($str){
return in_array(mb_detect_encoding($str,array('ASCII','GB2312','GBK','UTF-8','ISO-8859-1')),['GBK','CP936']);
}

function isut8str($str){
return in_array(mb_detect_encoding($str,array('ASCII','GB2312','GBK','UTF-8','ISO-8859-1')),['UTF-8']);
}

PHP判断字符串所属编码:ASCII、GB2312、GBK、UTF-8、ISO-8859-1的更多相关文章

  1. 字符编码-ASCII,GB2312,GBK,GB18030

    ASCII ASCII,GB2312,GBK,GB18030依次增加,向下兼容. 手机只需要支持GB2312 电脑中文windows只支持GBK 发展历程 如果你使用编译器是python2.0版本,默 ...

  2. 字符集、字符编码、国际化、本地化简要总结(UNICODE/UTF/ASCII/GB2312/GBK/GB18030)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明   普通的linux 和 普通的windows.    ...

  3. 2.数码相框-编码(ASCII/GB2312/Unicode)介绍,并使LCD显示汉字字符(2)

    在上章-学习了数码相框的框架分析(1)了 本章主要内容如下: 1)熟悉ASCII/GB2312/Unicode编码 2)写应用程序,使LCD显示汉字和字符 大家都知道,数据传输的是二进制,而字符和汉字 ...

  4. 2.数码相框-编码(ASCII/GB2312/Unicode)介绍

    转载:https://www.cnblogs.com/lifexy/p/8485634.html 在上章-学习了数码相框的框架分析(1)了 本章主要内容如下: 1)熟悉ASCII/GB2312/Uni ...

  5. [编码]ASCII、GBK、Unicode(万国码) 和 UTF-8

    American ASCII编码 (American Standard Code for Information Interchange,美国信息互换标准代码)  China    gbk编码     ...

  6. ASCII,GB2312,GBK,Unicode,Utf-8

    1.ASCII:American Stardand Code for Information Interchange,是当时美国制定出来的一套编码系统,使用7位或8位二进制来表示西文字符,0-31以及 ...

  7. java 判断字符串什么编码类型

    public static String getEncoding(String str) { String encode = "GB2312"; try { if (str.equ ...

  8. BIG5, GB(GB2312, GBK, ...), Unicode编码, UTF8, WideChar, MultiByte, Char说明与区别

    汉语unicode编译方式,BIG5是繁体规范,GB是简体规范 GB是大陆使用的国标码,BIG5码,又叫大五码,是台湾使用的繁体码. BIG5编码, GB编码(GB2312, GBK, ...), U ...

  9. 【java】乱码处理+编码转化+判断字符串编码方式

    之前有一篇是修改IDE的编码,服务器的编码等处理乱码,但是在所有环境因素上,保证了编码方式之后,也会有前台传递给后台[get方式提交]传递给后台的编码方式是非UTF-8的,也会有例如FTP服务器的编码 ...

随机推荐

  1. 彻底卸载MySQL5.7(msi,exe)版

    1,停止MySQL服务 2,右键找到任务管理器 3,在程序中卸载MySQL 4,删除MySQL安装目录 有的是在C:\Program Files下,我的是在(X86)下 5,删除隐藏文件中的MySQL ...

  2. Appium常用操作之「Toast提示信息获取」

    坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:Oschina.云+社区.知乎等各大平台都有. 目录 一.什么是 Toast 二.获取 Toast 提示信息的前提 1.针对这种元素,有的时候我们需要 ...

  3. HDU100题简要题解(2000~2009)

    前言(废话): 从11月6号到11月20号,断断续续做了有三个星期,总算整完了,之后会慢慢整理汇总到这里 中间部分用到数学知识的十几道题边学边做直接把我这个数学菜鸟做到怀疑人生 11.6~11.10又 ...

  4. Java的比较器Comparable与Comparator

    在Java中有两个比较器:Comparable.Comparator 对于Integer.Double等等类型,可以直接对他们进行比较,因为已经实现了比较的方式,然而在平时常常会面临需要对集合进行排序 ...

  5. httpservlet类中两个service方法

    在浏览器访问html页面时,当数据提交给servlet时发生了什么,这是我们需要了解的. 1.我们需要了解一下servlet的继承体系. servlet接口 ------->GenericSer ...

  6. mysql5.5升级5.7(1)

    卸载旧版本mysql 当然要记得备份数据库数据啦 1.查看需要卸载的部分: rpm -qa |grep -i mysql 2.开始卸载: yum remove mysql* 接下来是安装新版mysql ...

  7. JQuery案例:购物车编辑

    购物车编辑 实现了:商品的加减,总价的变动 实现了:全选/全不选(使用prop而不是attr) 实现了:删除(遮罩层) <html> <head> <meta chars ...

  8. Java基础教程——字符流

    字符流 字节流服务文本文件时,可能出现中文乱码.因为一个中文字符可能占用多个字节. 针对于非英语系的国家和地区,提供了一套方便读写方式--字符流. java.io.Reader java.io.Wri ...

  9. 安装Linux软件时遇到这个问题,如何解决?

    提示 Could not get lock /var/lib/dpkg/lock 报错? 有些小伙伴在使用 apt 包管理器更新或安装软件时,可能会遇到过诸如以下的错误提示: E: Could not ...

  10. synchronized底层揭秘

    前言 上篇文章我们从硬件级别探索,对可见性和有序性的认识上升了一个高度,却迟迟没有介绍原子性的解决方案. 今天我们就来聊一聊原子性的解决方案,锁. 引入锁机制,除了可以保证原子性,同时也可以保证可见性 ...