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服务器的编码 ...
随机推荐
- 设计模式(一)--工厂模式(Go实现)
package Factory import "fmt" type Restaurant interface { GetFood() } type Donglaishun stru ...
- 自动化测试_移动端测试(一) ----- Appium环境搭建
一. 安装node.js 因为Appium是使用nodejs实现的,所以node是解释器,首先需要确认安装好 官网下载node.js:https://nodejs.org/en/download/ 安 ...
- 汇编语言常用的DOS功能调用
今天掌握了汇编语言常用的DOS功能调用,现在列出来供参考. 1.单字符输入(1号调用) 格式:MOV AH,1 INT 21H 功能:达到输入状态,从键盘上输入字符的ASCII码送入AX中,并送显示器 ...
- phpmyadmin反序列化漏洞(WooYun-2016-199433)
简介 环境复现:https://github.com/vulhub/vulhub 线上平台:榆林学院内可使用协会内部的网络安全实验平台 phpMyAdmin是一套开源的.基于Web的MySQL数据库管 ...
- php 抛出异常
<?php //try里面执行的东西如果不成立,可直接 throw new Exception('异常信息'),那么try里面的程序将会被停止执行,直接执行catch里面的程序 try { if ...
- cookie和session的关系和区别
1.为什么会用到cookie和session 由于http请求是一种无状态的请求,一旦数据交换完毕便会关闭请求,再次交换数据则要再次发起请求,所以服务端无法通过连接追踪会话,确定用户身份,而cooki ...
- 宕机了,Redis数据丢了怎么办?
持续原创输出,点击上方蓝字关注我 目录 前言 什么是AOF? 三种写回策略 日志文件太大怎么办? AOF重写会阻塞主线程吗? AOF的缺点 总结 什么是RDB? 给哪些数据做快照? 快照时能够修改数据 ...
- 记录一次tomcat问题排查记录:org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 19
最近项目升级jdk,从jdk7 升级到 jdk8,本地已经自测完成了,需要部署到测试环境,测试环境已经装好 jdk8 了,但是tomcat 的版本还是 7.不过,据我之前了解,tomcat7是可以运行 ...
- 6.2 Binding基础
WPF最为核心的思想是数据驱动UI,实现这一技术的基石就是绑定技术(binding).如果把Binding比作数据的桥梁,那么它的两端分别是源(Source)和目标(Target),Binging是架 ...
- 发现了一个关于 gin 1.3.0 框架的 bug
gin 1.3.0 框架 http 响应数据错乱问题排查 问题概述 客户端同时发起多个http请求,gin接受到请求后,其中一个接口响应内容为空,另外一个接口响应内容包含接口1,接口2的响应内容,导致 ...