php自定义函数,实现判断字符集并转码功能。
原理分析:
gb2312/gbk是中文两字节,这两个字节是有取值范围的,而utf-8中汉字是三字节,同样每个字节也有取值范围。
英文环境下,不论在何种编码情况下,都是小于128,只占用一个字节(全角除外)。
如果是文件形式的编码检查,还可以直接check utf-8的BOM信息。
下面是这个函数的完整代码,用来对字符串编码进行检查和转码。
例子:
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);
}
?>
您可能感兴趣的文章:
学习php字符串编码的转换与判断
php获取字符串的编码格式的函数
PHP字符串编码问题分析
php iconv字符串编码转换(GBK到UTF8字符集)的例子
php 自动检测内容编码并转换的代码
php编码转换函数(自动转换字符集支持数组转换)
php改变编码的函数iconv
php面向对象编程中this,self,parent的用法。
一,this
1,使用用this,必须有个实例化后的对象,否则会报错:Fatal error: Using $this when not in object context。
2,this可以调用本类中的方法和属性,也可以调用父类中的可以调的方法和属性。
二,self
1,self可以访问本类中的静态属性和静态方法,可以访问父类中的静态属性和静态方法。
2,使用self时,可以不用实例化。
三,parent
1,parent可以访问父类中的静态属性和静态方法。
2,使用parent时,可以不用实例化。
有关php中self、parent、this的区别,还可以先看看之前的这篇:php中this,self,parent的区别 。
下面为了大家更好的理解php中self、parent、this的区别,我们来举个例子:
/**
* self、parent、this的区别
* by www.
*/
class test{
public $public;
private $private;
protected $protected;
static $instance;
static $good = 'tankzhang <br>';
public $tank = 'zhangying <br>';
public function __construct(){
$this->public = 'public <br>';
$this->private = 'private <br>';
$this->protected = 'protected <br>';
}
public function tank(){ //私有方法不能继承,换成public,protected
if (!isset()(self::$instance[get_class()]))
{
$c = get_class();
self::$instance = new $c;
}
return self::$instance;
}
public function pub_function() {
echo "you request public function<br>";
echo $this->public;
}
protected function pro_function(){
echo "you request protected function<br>";
echo $this->protected;
}
private function pri_function(){
echo "you request private function<br>";
echo $this->private;
}
static function sta_function(){
echo "you request static function<br>";
}
}
class test1 extends test{
static $love = "tank <br>";
private $aaaaaaa = "ying <br>";
public function __construct(){
parent::tank();
parent::__construct();
}
public function tank(){
echo $this->public;
echo $this->protected;
echo $this->aaaaaaa;
$this->pro_function();
}
public function test1_function(){
echo self::$love;
echo self::$good;
echo parent::$good;
echo parent::$tank; //Fatal error: Access to undeclared static property: test::$tank
echo self::$tank; //Fatal error: Access to undeclared static property: test::$tank
}
static function extends_function(){
parent::sta_function();
self::pro_function();
echo "you request extends_private function<br>";
}
}
error_reporting(E_ALL);
$test = new test1();
$test->tank(); //子类和父类有相同名字的属性和方法,实例化子类时,会调用子类中的方法。
test1::test1_function();
test1::extends_function(); //执行一部分后,报Fatal error: Using $this when not in object context in D:\xampp\htdocs\mytest\www4.php on line 32
?>
代码说明:
1,当调用$test->tank(); 方法时,tank里面的$this是一个对像,这个对像可以调用本类,父类中的方法和属性,
2,test1::test1_function(); 当用静态的方法去调用非静态方法时,会显示警告:Non-static method test::test1_function() should not be called statically。
self可以调用本类,父类中的静态属性 ,parent可以调用父类中的静态属性 ,二者调用非静态属性会报错。
3,test1::extends_function(); 这一步会报错,报在非对像中使用$this 。
test1::extends_function();只是调用了class中的一个方法,并没有实例化,不存在什么对像,当父类中用到$this时,当然就报错了。
例子,get_headers函数检测远程文件是否存在。
代码:
$url = 'http://example.com';
$hander_array = get_headers ( $url );
if ($header_array [0] == 'HTTP/1.1 200 OK') {
echo '文件存在';
} else {
echo '文件不存在';
}
说明:
get_headers函数的作用:当访问一个远程地址,把服务器发送的HTTP头以数组形式返回。
而$header[0]则是服务器返回的状态码(状态码一般是第一个返回的)。
因此,要确定一个文件在远端服务器上存在,只需要确定访问这个文件返回的状态码是"HTTP/1.1 200 OK"即可。
也可以通过判断状态码不是"HTTP/1.1 404 Not Found",也可以给出文件存在的解答。
下面再分享二个get_headers函数的例子,供大家参考。
1,获取三位HTTP响应码的例子:
function get_http_response_code($theURL) {
$headers = get_headers($theURL);
return substr($headers[0], 9, 3);
}
?>
2,排除重定向的例子:
/**
* 获取不包含重定向的报头
* by www.
*/
function get_real_headers($url,$format=0,$follow_redirect=0) {
if (!$follow_redirect) {
//set new default options
$opts = array('http' =>
array('max_redirects'=>1,'ignore_errors'=>1)
);
stream_context_get_default($opts);
}
//get headers
$headers=get_headers($url,$format);
//restore default options
if (isset($opts)) {
$opts = array('http' =>
array('max_redirects'=>20,'ignore_errors'=>0)
);
stream_context_get_default($opts);
}
//return
return $headers;
}
?>
附,php get_headers()
get_headers
(PHP 5)
get_headers — 取得服务器响应一个 HTTP 请求所发送的所有标头
说明
array get_headers ( string $url [, int $format ] )
get_headers() 返回一个数组,包含有服务器响应一个 HTTP 请求所发送的标头。如果失败则返回 FALSE 并发出一条 E_WARNING 级别的错误信息。
如果将可选的 format 参数设为 1,则 get_headers() 会解析相应的信息并设定数组的键名。
说明:
自 PHP 5.1.3 起本函数使用默认的流上下文,其可以用 stream_context_get_default() 函数设定和修改。
get_headers()的例子:
$url = 'http://www.';
print_r(get_headers($url));
print_r(get_headers($url, 1));
?>
输出类似于:
Array
(
[0] => HTTP/1.1 200 OK
[1] => Date: Sat, 29 May 2004 12:28:13 GMT
[2] => Server: Apache/1.3.27 (Unix) (Red-Hat/Linux)
[3] => Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
[4] => ETag: "3f80f-1b6-3e1cb03b"
[5] => Accept-Ranges: bytes
[6] => Content-Length: 438
[7] => Connection: close
[8] => Content-Type: text/html
)
Array
(
[0] => HTTP/1.1 200 OK
[Date] => Sat, 29 May 2004 12:28:14 GMT
[Server] => Apache/1.3.27 (Unix) (Red-Hat/Linux)
[Last-Modified] => Wed, 08 Jan 2003 23:11:55 GMT
[ETag] => "3f80f-1b6-3e1cb03b"
[Accept-Ranges] => bytes
[Content-Length] => 438
[Connection] => close
[Content-Type] => text/html
)