PHP自动识别字符集编码并完成转码

 更新时间:2016年11月25日 15:43  点击:2350
原理很简单,因为gb2312/gbk是中文两字节,这两个字节是有取值范围的,而utf-8中汉字是三字节,同样每个字节也有取值范围。而英文不管在何种编码情况下,都是小于128,只占用一个字节(全角除外)

在PHP处理页面的时候,我们对于字符集的转换都是采用了iconv或者mb_convert等函数,但,这其实是有一个前提的。即我们事先得知道in和out是什么样的编码,我们才能进行正确的转换。
下面这个函数,就可以在不知道源字符串编码的情况下,自动判断其编码并进行转换。虽然只支持UTF8编码和GB2312编码,但对于国内绝大多数网站来说,已经够用了。

 代码如下 复制代码


function safeEncoding($string,$outEncoding = 'UTF-8')
{
    $encoding = "UTF-8";
    for($i=0;$i<128)
            continue;

        if((ord($string{$i})&224)==224)
        {
            //第一个字节判断通过
            $char = $string{++$i};
            if((ord($char)&128)==128)
            {
                //第二个字节判断通过
                $char = $string{++$i};
                if((ord($char)&128)==128)
                {
                    $encoding = "UTF-8";
                    break;
                }
            }
        }
        if((ord($string{$i})&192)==192)
        {
            //第一个字节判断通过
            $char = $string{++$i};
            if((ord($char)&128)==128)
            {
                //第二个字节判断通过
                $encoding = "GB2312";
                break;
            }
        }
    }

    if(strtoupper($encoding) == strtoupper($outEncoding))
        return $string;
    else
        return iconv($encoding,$outEncoding,$string);
}

例2

 代码如下 复制代码


    //识别汉字编码,因为YBlog用的是utf-8,如果引用通告发过来的是gb2312的编码的话,需要可以识别并完成编码转换 
    function safeEncoding($string,$outEncoding = 'UTF-8') 
    { 
        $encoding = "UTF-8"; 
        for($i=0;$i<strlen($string);$i++) 
        { 
            if(ord($string{$i})<128) 
                continue; 
    
            if((ord($string{$i})&224)==224) 
            { 
                //第一个字节判断通过 
                $char = $string{++$i}; 
                if((ord($char)&128)==128) 
                { 
                    //第二个字节判断通过 
                    $char = $string{++$i}; 
                    if((ord($char)&128)==128) 
                    { 
                        $encoding = "UTF-8"; 
                        break; 
                    } 
                } 
            } 
            if((ord($string{$i})&192)==192) 
            { 
                //第一个字节判断通过 
                $char = $string{++$i}; 
                if((ord($char)&128)==128) 
                { 
                    //第二个字节判断通过 
                    $encoding = "GB2312"; 
                    break; 
                } 
            } 
        } 
         
        if(strtoupper($encoding) == strtoupper($outEncoding)) 
            return $string; 
        else
            return iconv($encoding,$outEncoding,$string); 
    }

要实现无刷新页面我们一般会用到ajax来实现,以前是使用最原始的js ajax验证现在常用的jquery ajax了只要简单的一句post即可解决了,下面我们看实例

index.php页面

 代码如下 复制代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns=http://www.111cn.net>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>php jquery check username ajax检查帐号唯一性</title>
<link href="../style.css" rel="stylesheet" type="text/css" />

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js"></script>
<script>
$(document).ready(function(){
$('#username').keyup(username_check);
});
 
function username_check(){ 
var username = $('#username').val();
if(username == "" || username.length < 4){
$('#username').css('border', '3px #CCC solid');
$('#tick').hide();
}else{

jQuery.ajax({
   type: "POST",
   url: "check.php",
   data: 'username='+ username,
   cache: false,
   success: function(response){
if(response == 1){
 //不可以注册
 $('#username').css('border', '3px #C33 solid'); 
 $('#tick').hide();
 $('#cross').fadeIn();
 }else{
 $('#username').css('border', '3px #090 solid');
 $('#cross').hide();
 $('#tick').fadeIn();
      }

}
});
}

 

}

</script>

<style>
#username{
 padding:3px;
 font-size:18px;
 border:3px #CCC solid;
}

#tick{display:none}
#cross{display:none}
 

</style>
</head>

<body>

Username: <input name="username" id="username" type="text" />
<img id="tick" src="tick.png" width="16" height="16"/>
<img id="cross" src="cross.png" width="16" height="16"/>

</body>
</html>

php验证页面,此页面接收到jquery ajax post过来的数据进行验证并返回值

 代码如下 复制代码

<?php

# FileName="Connection_php_mysql.htm"
# Type="MYSQL"
# HTTP="true"
$hostname_lr = "localhost";
$database_lr = "ordersiliconebracelets";
$username_lr = "root";
$password_lr = "";
$lr = mysql_pconnect($hostname_lr, $username_lr, $password_lr) or trigger_error(mysql_error(),E_USER_ERROR);
mysql_query("set names utf8;");
//if ($lr) {
//echo "非常好,MYSQL连接成功了!";
//} else {
//echo "不好意思,失败了!";
//}
mysql_select_db($database_lr, $lr);

//
$username = trim(strtolower($_POST['username']));
$username = mysql_escape_string($username);

if (eregi("^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3}$",$username)) {
 //email通过检查
 $query = "SELECT email FROM user WHERE email = '$username' LIMIT 1";
 $result = mysql_query( $query );
 $num = mysql_num_rows($result);
 
 echo $num;
}
else

{
echo "1";//不能注册

}
?>

在表单中我们有一个method属性,他可以让表单是post与get了,在php中就应该使用对应的get,post来接收了,下面我来介绍一下method参数说明

1.之前就是用过,在form表单post提交时,action的url传递get参数,服务器端是能获取到的:

 代码如下 复制代码

<?php
 print_r($_GET);
 print_r($_POST);
?>
 
<form action="get_post.php?id=100" method="post">
姓名:<input type="text" name="name" /><br>
年龄:<input type="text" name="age" /><br>
<input type="submit" value="提交" />
</form>

2.但是如果你的form提交类型为get,url中传递的参数却是获取不到的:

 代码如下 复制代码

<?php
 /**
  *测试get和post提交
  *@link(http://www.111cn.net)
  */
 print_r($_GET);
 print_r($_POST);
?>
 
<form action="get_post.php?id=100" method="get">
姓名:<input type="text" name="name" /><br>
年龄:<input type="text" name="age" /><br>
<input type="submit" value="提交" />
</form>

本文章给大家介绍PHP判断用户浏览器是否安装alexa工具条程序,原理很简单我们只要获和用户User-Agent识别字符,然后加以判断即可得知用户是不是安装了alexa工具条哦。

众所周知,alexa工具条是常用的网站第三方统计工具,通常我们会自行定制alexa工具条用来让用户安装,通过用户对工具条内容的点击来提高网站在alexa的排名。如下图中河北新闻网的alexa工具条。

河北新闻网的alexa工具条

如果我们在一些必要的php应用中需要强制用户安装,这就涉及到了alexa工具条安装与否的判断。浏览器在访问网页时php可以获取用户的User-Agent识别字符。使用装有Alexa Toolbar的浏览器在请求网页的时候,User-Agent识别字符中会多出alexa标记。用这个特性就可以判断用户的浏览器是否安装ALEXA工具条。通过PHP的$_SERVER['HTTP_USER_AGENT']来获取浏览器的UA字符串信息。以下为PHP判断用户浏览器是否安装alexa工具条代码:

 代码如下 复制代码
if(!preg_match("#Toolbar#i", $_SERVER['HTTP_USER_AGENT'])){
                showmessage(L('alexa_failure'), 'https://www.111cn.net',8000);
            }
由于firefox和ie浏览器中的User-Agent识别字符是不同的,firefox中为Alexa Toolbar,ie中为My Toolbar。所以我们判断的时候只需要判断识别字符中是否包含Toolbar就可以了

注意:IE9的alexa工具条信息获取方式

微软官方开发博客中表示,IE9默认使用比较短的User-Agent识别字符,不再附加.NET及其他任何由软件或机器生成的信息到UA字符串中。所以如果我们想获取IE9用户是否安装了alexa工具条就必须让用户点击“兼容性视图”(如下图所示)

IE9用户是否安装了alexa工具条

下面本文章来给各位同学总结了几种php去除字符串首尾中英文空格程序实例,这里有用正则替换与trim系列函数删除,下面我们来看看。

例1.trim函数删除空格


trim()函数用于去除字符串开始位置以及结束位置的空格,并返回去掉空格后的字符串。语法如下:
string trim(string str[,string charlist]);
ltrim()函数用于去除字符串左边的空格或指定字符串。语法如下:
string ltrim(string str[,string charlist]);
rtrim()函数用于去除字符串右边的空格和特殊字符。语法如下:
string rtrim(string str[,string charlist]);

 代码如下 复制代码
<?php
 
$a="(a,b,c,)";
echo $a."<br/>"; //输出:(a,b,c,)
$b=trim($a,"()"); //去除字符串首尾含有的字符“(”或“)”
echo $b."<br/>"; //输出:a,b,c,
$c=trim($a,"(,)"); //去除字符串首尾含有的字符“(”、“,”或“)”
echo $c."<br/>"; //输出:a,b,c
 
?>

 
输出结果:
(a,b,c,)
a,b,c,
a,b,c
在sql中函数trim()用途为去除首尾空格,ltrim()为去除字符串左侧空格,rtrim()为去除字符串右侧空格。

 

例2.利用str_replace正则替换

 代码如下 复制代码

function  mbTrim($str) 

        return mb_ereg_replace('(^( | )+|( | )+$)', '', $str); 

例3.str_replace正则替换

 代码如下 复制代码

<?
$str="      www.111cn.net     ";
$str = mb_ereg_replace('^( | )+', '', $str);
$str = mb_ereg_replace('( | )+$', '', $str);
echo mb_ereg_replace('  ', "n  ", $str);
?>

[!--infotagslink--]

相关文章

  • 运行vbs脚本报错无效字符、中文乱码的解决方法(编码问题)

    今天在写一个vbs的时候,发现中文乱码,后来写好代码正常运行的代码压缩一下给了同事,发现报无效字符,经过验证后发现原来是编码的问题导致,这里就为大家分享一下...2020-06-30
  • c#字符串编码编码(encoding)使用方法示例

    System.Text提供了Encoding的抽象类,这个类提供字符串编码的方法。使Unicode字符数组的字符串,转换为指定编码的字节数组,或者反之,看下面的例子...2020-06-25
  • 通过javascript进行UTF-8编码的实现方法

    下面小编就为大家带来一篇通过javascript进行UTF-8编码的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-07-01
  • C# 去除首尾字符或字符串的方法

    C# 去除首尾字符或字符串的方法,需要的朋友可以参考一下...2020-06-25
  • C# 中使用正则表达式匹配字符的含义

    正则表达式的作用用来描述字符串的特征。本文重点给大家介绍C# 中使用正则表达式匹配字符的含义,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧...2020-06-25
  • php中把unicode编码转化为中文

    小编在网上看到最多的就是汉字转换unicode编码了,今天我们看到一个反过来的操作就是把unicode转换成中文了,下面一起来看看 这两天帮别人开发微信平台好友板块,存...2016-11-25
  • .Net(c#)汉字和Unicode编码互相转换实例

    下面小编就为大家带来一篇.Net(c#)汉字和Unicode编码互相转换实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • R语言绘图时输出希腊字符上下标及数学公式实现方法

    这篇文章主要为大家介绍了R语言进行绘图时输出希腊字符上标,下标及数学公式的实现方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...2021-11-06
  • C语言简单实现计算字符个数的方法

    这篇文章主要介绍了C语言简单实现计算字符个数的方法,涉及C语言针对字符串的简单遍历与判定技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-04-25
  • R语言变量重编码、重命名的操作

    这篇文章主要介绍了R语言变量重编码、重命名的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
  • PHP把16进制的编码转为中文程序代码

    今天在做公司的项目的时候,遇到一个问题,群聊天记录存入数据库的时候把聊天记录及央视使用16进制转换,我在做将聊天记录导出为text文本的时候,需要将聊天记录先从16进制转...2016-11-25
  • php输出全部gb2312编码内的汉字方法

    本文介绍了php输出全部gb2312编码内的汉字方法,非常实用,有兴趣的同学可以参考一下 php输出全部gb2312编码内的汉字,$area表示分区,$pos表示分区内所在位置。 代码...2017-07-06
  • C++ string替换指定字符实例代码

    这篇文章主要给大家介绍了关于C++ string替换指定字符的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-04-25
  • php中mb_detect_encoding检测文件编码方法[非完美]

    在php中我们可以利用mb_detect_encoding函数来检查字符串编码或文件编码,mb_detect_encoding函数是php内置的一个函数了,下面我们简单介绍。 关于文件编码的检测,百...2016-11-25
  • golang如何去除多余空白字符(含制表符)

    这篇文章主要介绍了golang去除多余空白字符(含制表符)的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-25
  • 解决python3 中的np.load编码问题

    这篇文章主要介绍了解决python3 中的np.load编码问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-27
  • JS利用正则配合replace替换指定字符

    替换指定字符的方法有很多,在本文为大家详细介绍下,JS利用正则配合replace是如何做到的,喜欢的朋友可以参考下...2021-05-07
  • 一个字符串中出现次数最多的字符 统计这个次数【实现代码】

    下面小编就为大家带来一篇一个字符串中出现次数最多的字符 统计这个次数【实现代码】。小编觉得挺不错的,现在分享给大家,也给大家做个参考...2016-05-04
  • JavaScript字符和ASCII实现互相转换

    这篇文章主要介绍了JavaScript字符和ASCII实现互相转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-04
  • Mysql中关于Incorrect string value的解决方案

    在对mysql数据库中插入数据的时候,直接插入中文是没有问题的!但是用预编译语句时,用流对数据进行处理总报incorrect string value这个异常。本篇文章教给你解决方法...2021-09-20