PHP自动识别字符集并完成转码详解
话不多说,直接上函数,这个函数是用来对字符串进行检查和转码的。需要的朋友可以过来参考下
因为自己使用字符编码一般的是utf-8编码,但如果对方的博客使用gb2312编码的话,POST过来就会出现乱码(除非对方POST前先转换编码)。在不能保证对方是否一定使用utf-8编码的情况下,自己做一个编码的检查和转换是很有必要的。
写了个函数来完成这个工作,原理很简单,因为gb2312/gbk是中文两字节,这两个字节是有取值范围的,而utf-8中汉字是三字节,同样每个字节也有取值范围。而英文不管在何种编码情况下,都是小于128,只占用一个字节(全角除外)。
如果是文件形式的编码检查,还可以直接check utf-8的BOM信息,关于这方面的东西,大家可以看看TP工具箱的编码转换功能,我在那个AppCodingSwitch类中写了比较详细的注释。
话不多说,直接上函数,这个函数是用来对字符串进行检查和转码的。
文件的检查与转码,代码:
- <?php
- /**
- * 自动识别字符集并转码
- * by www.jbxue.com
- * date: 2013-08-02
- */
- 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
- returniconv($encoding, $outEncoding, $string);
- }
- ?>
PHP自动识别字符集并完成转码详解的更多相关文章
- ASCII码详解
ASCII码详解 ASCII码表 ASCII码大致可以分作三部分組成.第一部分是:ASCII非打印控制字符: 第二部分是:ASCII打印字符: 第三部分是:扩展ASCII打印字符. 第一部分:ASCI ...
- [Qt Creator 快速入门] 第2章 Qt程序编译和源码详解
一.编写 Hello World Gui程序 Hello World程序就是让应用程序显示"Hello World"字符串.这是最简单的应用,但却包含了一个应用程序的基本要素,所以 ...
- 源码详解系列(六) ------ 全面讲解druid的使用和源码
简介 druid是用于创建和管理连接,利用"池"的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制.连接可靠性测试.连接泄露控制.缓存语句等功能,另外,druid还扩展 ...
- 源码详解系列(七) ------ 全面讲解logback的使用和源码
什么是logback logback 用于日志记录,可以将日志输出到控制台.文件.数据库和邮件等,相比其它所有的日志系统,logback 更快并且更小,包含了许多独特并且有用的特性. logback ...
- HTTP协议 (六) 状态码详解
HTTP协议 (六) 状态码详解 HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了. 如果 ...
- Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解
Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解 今天主要理一下StreamingContext的启动过程,其中最为重要的就是Jo ...
- [Spark内核] 第40课:CacheManager彻底解密:CacheManager运行原理流程图和源码详解
本课主题 CacheManager 运行原理图 CacheManager 源码解析 CacheManager 运行原理图 [下图是CacheManager的运行原理图] 首先 RDD 是通过 iter ...
- python接口自动化(七)--状态码详解对照表(详解)
简介 我们为啥要了解状态码,从它的作用,就不言而喻了.如果不了解,我们就会像个无头苍蝇,横冲直撞.遇到问题也不知道从何处入手,就是想找别人帮忙,也不知道是找前端还是后端的工程师. 状态码的作用是:we ...
- spring事务详解(三)源码详解
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...
随机推荐
- oc中的block使用心得
typedef void (^ simpleBlock) (void); typedef double (^multiplyTwoValues)(double, double); typedef vo ...
- [Javascript]jquery $(document).ready() 与window.onload的区别
引用:http://www.jb51.net/article/21628.htm Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload ...
- 【Python千问 1】Python核心编程(第二版)导读
第一章 欢迎来到Python世界 什么是Python Python的起源 Python的特点 下载Python 安装Python 运行Python Python文档 比较Python(与其它语言的比较 ...
- Java Script基础(十二) 正则表达式
一.正则表达式中常用的符号 虽然可以使用string函数来完成验证,但是这种验证方式不够严谨,而且编写比较麻烦.而正则表达式是一种描述字符模式的对象,由一些特殊的符号组成,其组成的字母模式用来匹配各种 ...
- Phd之导师的作用
1.研究技巧(专业知识,研究方向,方法论,写作技巧和演讲技巧) 当导师手下的学生少时,他可能会手把手的叫你一些知识,导师手下的学生多时,他会让你自己去学习某个领域的知识.当你掌握了一定专业知识后,导师 ...
- Centos下LAMP环境搭建
CentOs下环境搭建.2015.04.15.0001 Author:周凯 Time: 2015.04.15 版本号:2015.04.15.0001 安装过程 安装apache yum install ...
- 非web项目中使用XDT的实例(续)
简化 上个实例中,我们是引用了target文件来遍历项目中的xdt项. 当项目比较小,我们又只需要针对固定的config文件进行更替时,可以使用更简化的方法 不进行项目配置文件中的插入<Impo ...
- 【转】C#之继承
本文意在巩固基础知识,并不是对其进行深入剖析,如若对各位高手没有什么作用,请绕过. 本文为原创文,所有示例均是博主测试过的,欢迎大家批评指正,如有转载请标明出处,谢谢. 继承.封装和多态是面向对象编程 ...
- Top 10 Programming Fonts
Top 10 Programming Fonts Sunday, 17 May 2009 • Permalink Update: This post was written back in 2009, ...
- Fragment 总结
本博客代码地址 : -- 单一 Fragment 示例 : https://github.com/han1202012/Octopus-Fragement.git -- 可复用的 Fragment 示 ...