手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆

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

首页 > PHP >

在PHP处理页面的时候,我们对于字符集的转换都是采用了iconv或者mb_convert等函数,但,这其实是有一个前提的。即我们事先得知道in和out是什么样的编码,我们才能进行正确的转换。
虽然大多数转换都是在gbk和utf-8之间转,但如果不知道转换对象的编码怎么办呢?yhustc.com上就有这么一个函数safeEncoding,可以简单的识别UTF8和GBK的编码(国内,基本上也就这两种最常用吧。big5?咱们不考虑,哈哈)

原文地址为:http://www.yhustc.com/Blog/156.html
内容如下:

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);  

 

 




本站采用创作共享版权协议, 要求署名、非商业和保持一致. 本站欢迎任何非商业应用的转载, 但须注明出自"易栈网-膘叔", 保留原始链接, 此外还必须标注原文标题和链接.

Tags: 编码, 转换

« 上一篇 | 下一篇 »

只显示10条记录相关文章

参数编码 完全解决方案[ZZ] (浏览: 24772, 评论: 0)

2条记录访客评论

很实用,我收下了,谢谢喽

Post by vetements on 2009, October 19, 2:05 PM 引用此文发表评论 #1

这个强的

Post by roln on 2009, June 9, 3:56 PM 引用此文发表评论 #2


发表评论

评论内容 (必填):