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服务器的编码 ...
随机推荐
- hive简单的项目实战
解压user.zip [root@hadoop1 test]# unzip user.zip -d /test/bigdatacase/dataset Archive: user.zip inflat ...
- 基于tcp的socket通信
# socket # socekt是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,socket其实就是一个门面模式,它 # 把复杂的tcp/ip协议族隐藏在socket接 ...
- Linux系统学习07-Centos软件安装几种方法
配置好Centos一些基础设置后,接下来就是学习平时使用最多的软件安装. windwos下软件安装非常简单,就是下载好安装包,然后双击就会自动安装. 而Centos里面安装软件的方式方法有区别,熟悉几 ...
- Linux内核剖析——操作系统的启动
一.总体功能 1.从通电到BIOS跳转 1.1 CPU在通电后,先进入实模式,设置CS=0XFFFF,IP = 0X0000(指向BIOS) 1.2 BIOS进行执行系统监测,并且在地址=0处初始化中 ...
- sqlilab less28 less28a
less-28 less-28a 二者相差不大 单引号小括号包裹,黑名单过滤--,#,空格,union空格select(不区分大小写) less-28的黑名单 less-28a的黑名单 %a0,不被 ...
- 深度分析:Java中如何如理异常,一篇帮你搞定!
异常的背景 初识异常 我们曾经的代码中已经接触了一些 "异常" 了. 例如: 除以 0 System.out.println(10 / 0); // 执行结果 Exception ...
- java开发两年,连Spring中bean的装配都不知道?你怎么涨薪啊
Spring 1.1.1.1 创建一个bean package com.zt.spring; public class MyBean { private String userName; privat ...
- 美食vlog如何剪辑?用什么视频制作软件剪辑比较好?
是不是发现自己拍摄的美食永远没有美食博主拍出来的好看?那么美食vlog如何剪辑?用什么视频制作软件剪辑比较好呢?下面小编就教大家用视频编辑软件会声会影强大的颜色分级功能就能拯救你的美食vlog. 接下 ...
- 写给程序员的机器学习入门 (九) - 对象识别 RCNN 与 Fast-RCNN
因为这几个月饭店生意恢复,加上研究 Faster-RCNN 用掉了很多时间,就没有更新博客了.这篇开始会介绍对象识别的模型与实现方法,首先会介绍最简单的 RCNN 与 Fast-RCNN 模型,下一篇 ...
- Leetcode 周赛#200 题解
1535 找出数组游戏的赢家 #模拟+优化 题目链接 题意 给你一个由 不同 整数组成的整数数组 arr 和一个整数 k(\(1\leq k\leq1e9\)) .每回合游戏都在数组的arr[0] 和 ...