PHP判断字符串所属编码:ASCII、GB2312、GBK、UTF-8、ISO-8859-1
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的更多相关文章
- 字符编码-ASCII,GB2312,GBK,GB18030
ASCII ASCII,GB2312,GBK,GB18030依次增加,向下兼容. 手机只需要支持GB2312 电脑中文windows只支持GBK 发展历程 如果你使用编译器是python2.0版本,默 ...
- 字符集、字符编码、国际化、本地化简要总结(UNICODE/UTF/ASCII/GB2312/GBK/GB18030)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明 普通的linux 和 普通的windows. ...
- 2.数码相框-编码(ASCII/GB2312/Unicode)介绍,并使LCD显示汉字字符(2)
在上章-学习了数码相框的框架分析(1)了 本章主要内容如下: 1)熟悉ASCII/GB2312/Unicode编码 2)写应用程序,使LCD显示汉字和字符 大家都知道,数据传输的是二进制,而字符和汉字 ...
- 2.数码相框-编码(ASCII/GB2312/Unicode)介绍
转载:https://www.cnblogs.com/lifexy/p/8485634.html 在上章-学习了数码相框的框架分析(1)了 本章主要内容如下: 1)熟悉ASCII/GB2312/Uni ...
- [编码]ASCII、GBK、Unicode(万国码) 和 UTF-8
American ASCII编码 (American Standard Code for Information Interchange,美国信息互换标准代码) China gbk编码 ...
- ASCII,GB2312,GBK,Unicode,Utf-8
1.ASCII:American Stardand Code for Information Interchange,是当时美国制定出来的一套编码系统,使用7位或8位二进制来表示西文字符,0-31以及 ...
- java 判断字符串什么编码类型
public static String getEncoding(String str) { String encode = "GB2312"; try { if (str.equ ...
- BIG5, GB(GB2312, GBK, ...), Unicode编码, UTF8, WideChar, MultiByte, Char说明与区别
汉语unicode编译方式,BIG5是繁体规范,GB是简体规范 GB是大陆使用的国标码,BIG5码,又叫大五码,是台湾使用的繁体码. BIG5编码, GB编码(GB2312, GBK, ...), U ...
- 【java】乱码处理+编码转化+判断字符串编码方式
之前有一篇是修改IDE的编码,服务器的编码等处理乱码,但是在所有环境因素上,保证了编码方式之后,也会有前台传递给后台[get方式提交]传递给后台的编码方式是非UTF-8的,也会有例如FTP服务器的编码 ...
随机推荐
- Python_Tips_dump\load 和 dumps\loads 的区别与联系
dump\load 和 dumps\loads 的区别与联系 """ Python3 JSON模块的使用 参考链接:https://docs.python.org/3/ ...
- 谈谈什么是MySQL的表空间?
今天我要跟你分享的话题是:"大家常说的表空间到底是什么?究竟什么又是数据表?" 这其实是一个概念性的知识点,当作拓展知识.涉及到的概念大家了解一下就好,涉及的参数,留个印象就好. ...
- mysql学习笔记1(mysql的基本架构)
mysql基本架构图 如图所示: 1 . MySQL 可以分为 Server 层和存储引擎层两部分 Server 层包括连接器.查询缓存.分析器.优化器.执行器等,涵盖 MySQL 的大多数核心服务功 ...
- kali 系列学习02 - 被动扫描
被动扫描是指目标无法察觉的情况下进行信息收集,注意有经验的渗透工程师会在信息收集上花费整个测试过程一半以上的时间,信息量太大,需要自动化的信息收集工具. 一.借鉴<kali linux2 网络渗 ...
- 对于线程池ThreadPool的学习总结
线程池:就是一个管理线程的池子. 优点: 它帮我们管理线程,避免增加创建线程和销毁线程的资源损耗.因为线程其实也是一个对象,创建一个对象,需要经过类加载过程,销毁一个对象,需要走GC垃圾回收流程,都是 ...
- CorelDRAW常用工具之渐变工具
我们在进行宣传单页或者LOGO等等各种平面设计时,颜色的使用是极为重要的一方面.有些新手可能还不知道怎么填充多种颜色的渐变,有的背景色不止2个颜色渐变,而是由多种颜色调成的. 我们在画布上画两个图形, ...
- Java 滴IO系统
JAVA IO 流可以概括为 "两个对应,一个桥梁".两个对应指字节流(Byte Stream)和字符流(Char Stream)的对应,输入流和输出流的对应. 一个桥梁指从字节流 ...
- mycat分片及主从(二)
一.mycat分片规则 经过上一篇幅讲解,应该很清楚分片规则配置文件rule.xml位于$MYCAT_HOME/conf目录,它定义了所有拆分表的规则.在使用过程中可以灵活使用不同的分片算法,或者对同 ...
- 一分钟了解 sync、fsync、fdatasync 系统调用
目录 一.缓冲 二.延迟写的优缺点 三.sync.fsync.fdatasync 关注送书!<Netty实战>(今晚开奖) Hi,大家好!我是白日梦. 今天我要跟你分享的话题是:" ...
- 基于Kubernetes和OpenKruise的可变基础设施实践
本文首发在OPPO互联网公众号,欢迎点击转载 https://mp.weixin.qq.com/s/hRvZz_bZfchmP0tkF6M2OA 对于可变基础设施的思考 kubernetes中的可变与 ...