zoukankan      html  css  js  c++  java
  • PHP自动识别字符集并完成转码

    YBlog能接收引用通告,但是因为YBlog自己使用的是utf-8编码,如果对方的博客系统使用gb2312的编码的话,POST过来就会出现乱码(除非对方POST前先转换编码)。在不能保证对方是否一定使用utf-8编码的情况下,自己做一个编码的检查和转换是很有必要的。写了个函数来完成这个工作,原理很简单,因为gb2312/gbk是中文两字节,这两个字节是有取值范围的,而utf-8中汉字是三字节,同样每个字节也有取值范围。而英文不管在何种编码情况下,都是小于128,只占用一个字节(全角除外)。

    如果是文件形式的编码检查,还可以直接check utf-8的BOM信息,关于这方面的东西,大家可以看看TP工具箱的编码转换功能,我在那个AppCodingSwitch类中写了比较详细的注释。

    话不多说,直接上函数,这个函数是用来对字符串进行检查和转码的。文件的检查与转码,看这里

    php代码
    1. //识别汉字编码,因为YBlog用的是utf-8,如果引用通告发过来的是gb2312的编码的话,需要可以识别并完成编码转换  
    2. function safeEncoding($string,$outEncoding = 'UTF-8')  
    3. {  
    4.     $encoding = "UTF-8";  
    5.     for($i=0;$i<strlen($string);$i++)  
    6.     {  
    7.         if(ord($string{$i})<128)  
    8.             continue;  
    9.  
    10.         if((ord($string{$i})&224)==224)  
    11.         {  
    12.             //第一个字节判断通过  
    13.             $char = $string{++$i};  
    14.             if((ord($char)&128)==128)  
    15.             {  
    16.                 //第二个字节判断通过  
    17.                 $char = $string{++$i};  
    18.                 if((ord($char)&128)==128)  
    19.                 {  
    20.                     $encoding = "UTF-8";  
    21.                     break;  
    22.                 }  
    23.             }  
    24.         }  
    25.         if((ord($string{$i})&192)==192)  
    26.         {  
    27.             //第一个字节判断通过  
    28.             $char = $string{++$i};  
    29.             if((ord($char)&128)==128)  
    30.             {  
    31.                 //第二个字节判断通过  
    32.                 $encoding = "GB2312";  
    33.                 break;  
    34.             }  
    35.         }  
    36.     }  
    37.       
    38.     if(strtoupper($encoding) == strtoupper($outEncoding))  
    39.         return $string;  
    40.     else 
    41.         return iconv($encoding,$outEncoding,$string);  
  • 相关阅读:
    centos7 tar.gz zip 解压命令[转]
    centos7 下 安装visual studio code ,打开运行。
    yum提示Another app is currently holding the yum lock; waiting for it to exit...
    Linux CentOS7 安装
    虚拟机 centos7 的网络与电脑所在一个网络如何设置
    django创建web项目
    uwsgi Flask web.py
    MariaDB 与 MySQL 区别
    python pymysql 与 mysqlclient
    如何提高自己的象棋水平及象棋开局的五种忌讳
  • 原文地址:https://www.cnblogs.com/zhouwenwu/p/2415256.html
Copyright © 2011-2022 走看看