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服务器的编码 ...
随机推荐
- 说说基于网络的五种IO模型
# django不是一个异步框架 # tornado是异步的web框架 # 处理每秒大量的请求 # 个人理解的IO:就是应用层与内核驱动层的交互,这个过程无论从应用层到内核中,还是驱动层等待硬件层的数 ...
- 企业级工作流解决方案(十)--集成Abp和ng-alain--权限系统
权限系统 应用系统离不开权限控制,权限中心不一定能抽象出所有的业务场景,这里定义的权限系统不一定能够满足所有的场景,但应该可以满足多数的业务需求. Abp的zero项目也定义了权限相关的表,但里面很多 ...
- 关于oracle11g 和sqldeverloper的安装配置
0友情提示:以下下载地址都是我的百度云分享链接安全无毒请放心下载! 电脑配置 win10 jdk版本1.7 下载oracle11G 版本 下载地址:安装很简单 sqldverloper(oracleD ...
- 图像分割必备知识点 | Dice损失 理论+代码
本文包含代码案例和讲解,建议收藏,也顺便点个赞吧.欢迎各路朋友爱好者加我的微信讨论问题:cyx645016617. 在很多关于医学图像分割的竞赛.论文和项目中,发现 Dice 系数(Dice coef ...
- 如何用Prometheus监控十万container的Kubernetes集群
概述 不久前,我们在文章<如何扩展单个Prometheus实现近万Kubernetes集群监控?>中详细介绍了TKE团队大规模Kubernetes联邦监控系统Kvass的演进过程,其中介绍 ...
- FL Studio20效果器Fruity Reverb 2功能介绍
FL Studio,也就是我梦通常所说的水果音乐制作软件,是一款新手就可以用的软件.其操作简单,界面简洁大方,就算只用鼠标也可以轻松编曲. FL Studio20中有许多自带合成器是很好用的,同时也是 ...
- guitar pro 系列教程(十):关于Guitar Pro声部的使用技巧
作为一个刚接触吉他的萌音乐的玩家,我们在创作吉他谱时一定要注意其中的声部搭配,因为各个声部的配器音色和旋律会对我们的曲子有着非常重要的影响,而声部的把控技术,也可以体现一个音乐人的能力水平的一方面.今 ...
- redlock分布式锁真的安全吗
此文是对http://zhangtielei.com/posts/blog-redlock-reasoning-part2.html文章的个人归纳,如有问题请联系删除 什么是redlock redlo ...
- yii2.0 curl的使用
yii2 curl的使用办法 get: use linslin\yii2\curl; public function actionCurl($value =0) { $url = 'http://ya ...
- 03-Python里字符串的常用操作方法二
1.lstrip():删除左侧空白字符 实例: my_str = ' hello world and my and test and python ' # 原始字符串 print(my_str) # ...