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事务详解(五)总结提高 一.引子 ...
随机推荐
- 【Mood 16 】史上最全github使用方法:github入门到精通
[初识Github] 首先让我们大家一起喊一句“Hello Github”.YEAH!就是这样. Git 是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管 ...
- Tomcat内存设置详解
Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 JVM在 ...
- Flex学习总结
Flex SDK Flex框架类库.Flex编译环境.调式器.MXML.ActionScript编程语言以及其它工具组成,Flash Builder是其开发环境, Flash Player的工作模 ...
- C#备份,还原数据库
private void btnBack_Click(object sender, EventArgs e) { string saveAway = @"C:\1.bak"; // ...
- Error reading from file 解决办法
最近安装程序遇见这个问题: Error reading from file. 解决办法: 给这个程序添加权限: 添加SYSTEM的读写改..如果比较懒,直接全部允许. 然后Retry.
- SqlServer之代码块相关
原创文章,转载必需注明出处:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/sqlserver-codeblock/ 一.go语句 ...
- 【Linux】Shell脚本编程(一)
Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...
- angularjs表格方式显示数据
<table> <tr ng-repeat="x in names"> <td>{{ x.Name }}</td> <td&g ...
- 转: 视频相关的协议族介绍(rtsp, hls, rtmp)
转自: http://www.zhihu.com/question/20621558 作者:杨华链接:http://www.zhihu.com/question/20621558/answer/1 ...
- Linux之装机指南
软件: Variety:桌面壁纸自动切换 sudo add-apt-repository ppa:peterlevi/ppa sudo apt-get update sudo apt-get inst ...