各种平台和软件打开显示的编码问题,需要使用不同的编码,根据我们不同的需求。

php 字符编码转换类,支持ANSI、Unicode、Unicode big endian、UTF-8、UTF-8+Bom 互相转换。

四种常见文本文件编码方式

ANSI编码

无文件头(文件编码开头标志性字节)

ANSI编码字母数字占一个字节,汉字占两个字节

回车换行符,单字节, 十六进制表示为0d  0a

UNICODE编码:

文件头,十六进制表示为FF FE

每一个字符都用两个字节编码

回车换行符, 双字节,十六进制表示为 000d  000a

Unicode big endian编码:

文件头十六进制表示为FE FF

后面编码是把字符的高位放在前面,低位放在后面,正好和Unicode编码颠倒

回车换行符,双字节,十六进制表示为0d00  0a00

UTF-8 编码:

文件头,十六进制表示为EF BB BF

UTF-8是Unicode的一种变长字符编码,数字、字母、回车、换行都用一个字节表示,汉字占3个字节

回车换行符,单字节,十六进制表示为0d 0a

转换原理:先把字符编码转为UTF-8,然后再从UTF-8转换为对应的字符编码。

CharsetConv.class.php:

 <?php
/**字符编码转换类, ANSI、Unicode、Unicode big endian、UTF-8、UTF-8+Bom互相转换
*Date: 2015-01-28
*Author: fdipzone
*Ver: 1.0
*
*Func:
*public convert 转换
*private convToUtf8 把编码转为UTF-8编码
*private convFromUtf8 把UTF-8编码转换为输出编码
*/ class CharsetConv{ // class start private $_in_charset = null; // 源编码
private $_out_charset = null; // 输出编码
private $_allow_charset = array('utf-8', 'utf-8bom', 'ansi', 'unicode', 'unicodebe'); /**初始化
* @param String $in_charset 源编码
* @param String $out_charset 输出编码
*/
public function __construct($in_charset, $out_charset){ $in_charset = strtolower($in_charset);
$out_charset = strtolower($out_charset); // 检查源编码
if(in_array($in_charset, $this->_allow_charset)){
$this->_in_charset = $in_charset;
} // 检查输出编码
if(in_array($out_charset, $this->_allow_charset)){
$this->_out_charset = $out_charset;
} } /**转换
* @param String $str 要转换的字符串
* @return String 转换后的字符串
*/
public function convert($str){ $str = $this->convToUtf8($str); // 先转为utf8
$str = $this->convFromUtf8($str); // 从utf8转为对应的编码 return $str;
} /**把编码转为UTF-8编码
* @param String $str
* @return String
*/
private function convToUtf8($str){ if($this->_in_charset=='utf-8'){ // 编码已经是utf-8,不用转
return $str;
} switch($this->_in_charset){
case 'utf-8bom':
$str = substr($str, 3);
break; case 'ansi':
$str = iconv('GBK', 'UTF-8//IGNORE', $str);
break; case 'unicode':
$str = iconv('UTF-16le', 'UTF-8//IGNORE', substr($str, 2));
break; case 'unicodebe':
$str = iconv('UTF-16be', 'UTF-8//IGNORE', substr($str, 2));
break; default:
break;
} return $str; } /**把UTF-8编码转换为输出编码
* @param String $str
* @return String
*/
private function convFromUtf8($str){ if($this->_out_charset=='utf-8'){ // 输出编码已经是utf-8,不用转
return $str;
} switch($this->_out_charset){
case 'utf-8bom':
$str = "\xef\xbb\xbf".$str;
break; case 'ansi':
$str = iconv('UTF-8', 'GBK//IGNORE', $str);
break; case 'unicode':
$str = "\xff\xfe".iconv('UTF-8', 'UTF-16le//IGNORE', $str);
break; case 'unicodebe':
$str = "\xfe\xff".iconv('UTF-8', 'UTF-16be//IGNORE', $str);
break; default:
break;
} return $str; } } // class end ?>

demo:unicode big endian 转为 utf-8+bom:

 <?php
require "CharsetConv.class.php"; $str = file_get_contents('source/unicodebe.txt'); $obj = new CharsetConv('unicodebe', 'utf-8bom');
$response = $obj->convert($str); file_put_contents('response/utf-8bom.txt', $response, true);
?>

参考:https://www.kancloud.cn/digest/php-class/153445

编码问题 php字符编码转换类的更多相关文章

  1. 【JAVA编码】 JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换

    http://blog.csdn.net/qinysong/article/details/1179489 这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记 ...

  2. 【字符编码】Java字符编码详细解答及问题探讨

    一.前言 继上一篇写完字节编码内容后,现在分析在Java中各字符编码的问题,并且由这个问题,也引出了一个更有意思的问题,笔者也还没有找到这个问题的答案.也希望各位园友指点指点. 二.Java字符编码 ...

  3. java 字节流和字符流转换类InputStreamReader,OutPutStreamReader

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2pjMjExMzIy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  4. C# 字符编码类Encoding

    在网络通信中,很多情况下都是将字符信息转成字节序列进行传输.将字符序列转为字节序列的过程称为编码.当这些字节传送到接收方,接收方需要逆向将字节序列转为字符序列.这个过程就是解码. 常见编码有ASCII ...

  5. Python—字符编码转换、函数基本操作

    字符编码转换 函数 #声明文件编码,格式如下: #-*- coding:utf-8 -*- 注意此处只是声明了文件编码格式,python的默认编码还是unicode 字符编码转换: import sy ...

  6. (2)字符编码关系和转换(bytes类型)

    ASCII 占一个字节,只支持英文 GB2312 占2个字节,只支持6700+汉字 GBK 是GB2312的升级版,支持21000+汉字 Shift-JIS 日本字符编码 ks_c-5601-1987 ...

  7. 转:Python常见字符编码及其之间的转换

    参考:Python常见字符编码 + Python常见字符编码间的转换 一.Python常见字符编码 字符编码的常用种类介绍 第一种:ASCII码 ASCII(American Standard Cod ...

  8. [原创]java WEB学习笔记45:自定义HttpFilter类,理解多个Filter 代码的执行顺序,Filterdemo:禁用浏览器缓存的Filter,字符编码的Filter,检查用户是否登陆过的Filter

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  9. 【转】关于字符编码,你所需要知道的(ASCII,Unicode,Utf-8,GB2312…)

    转载地址:http://www.imkevinyang.com/2010/06/%E5%85%B3%E4%BA%8E%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%EF%BC ...

随机推荐

  1. Linux指令--chown

    chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID:组可以是组名或者组ID:文件是以空格分开的要改变权限的文件列表,支持通配符.系统管理员经常使用chown命令,在将文件拷贝 ...

  2. HashiCorp Vault介绍

    HashiCorp Vault是一款企业级私密信息管理工具.说起Vault,不得不提它的创造者HashiCorp公司.HashiCorp是一家专注于DevOps工具链的公司,其旗下明星级产品包括Vag ...

  3. Android Studio 下获取debug sha1和md5

    Open Android Studio Open Your Project Click on Gradle (From Right Side Panel, you will see Gradle Ba ...

  4. 企业级Docker私有仓库之Harbor部署(http)

    部署环境 Centos7.3 x64 docker-ce-17.06.0 docker-compose-1.15.0 Python-2.7.5(系统默认) Docker及Docker-compose安 ...

  5. IIS6/7 配置问题

    IIS7 / IIS6 HttpMoudles 在web.config 中不同的配置 原创 2011年04月25日 08:44:00 标签: iis / server 4357 昨天把我们写的程序布署 ...

  6. 安装php扩展phpredis

    下载phpredis-master.tar.gz下载地址:http://pan.baidu.com/s/1i37R8TB 解包tar zxvf phpredis-master.tar.gzcd php ...

  7. Go笔记-垃圾回收集和SetFinalizer

    [垃圾回收]     1- Go的开发者也不用写代码来释放程序中不再使用的变量和结构占用内存,Go中有独立的进程,垃圾回收器(GC),处理这些事情.它会搜索不再使用的变量然后释放它们.     2- ...

  8. mybatis No enum const class org.apache.ibatis.type.JdbcType.Integer

    mybatis报错:没有Integer这个类型的jdbcType值 原因:mybatis配置重的jdbaType类型要是大写的 如图所示:

  9. 夏令营讲课内容整理 Day 2.

    本日主要内容是并查集和堆. 并查集 并查集是一种树型的数据结构,通常用来处理不同集合间的元素之间的合并与查找问题.一个并查集支持三个基本功能:合并.查找和判断.举一个通俗的例子,我和lhz认识,lhz ...

  10. BZOJ 1856: [Scoi2010]字符串 [Catalan数]

    1856: [Scoi2010]字符串 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1418  Solved: 790[Submit][Status][ ...