PHP中的mb_convert_encoding与iconv函数介绍

iconv函数库能够完成各种字符集间的转换,是php编程中不可缺少的基础函数库。 
1、下载libiconv函数库http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.9.2.tar.gz; 
2、解压缩tar -zxvf libiconv-1.9.2.tar.gz; 
3、安装libiconv 
       #configure --prefix=/usr/local/iconv 
       #make 
       #make install 
4、重新编译php 增加编译参数--with-iconv=/usr/local/iconv 

windows下

最近在做一个小偷程序,需要用到iconv函数把抓取来过的utf-8编码的页面转成gb2312, 发现只有用iconv函数把抓取过来的数据一转码数据就会无缘无故的少一些。  让我郁闷了好一会儿,去网上一查资料才知道这是iconv函数的一个bug。iconv在转换字符"—"到gb2312时会出错   
解决方法很简单,就是在需要转成的编码后加 "//IGNORE"  也就是iconv函数第二个参数后.如下:  

以下为引用的内容: 

复制代码代码如下:

iconv("UTF-8","GB2312//IGNORE",$data) 


ignore的意思是忽略转换时的错误,如果没有ignore参数,所有该字符后面的字符串都无法被保存。  

复制代码代码如下:

<?php 
echo $str= '你好,这里是卖咖啡!'; 
echo '<br />'; 
echo iconv('GB2312', 'UTF-8', $str); //将字符串的编码从GB2312转到UTF-8 
echo '<br />'; 
echo iconv_substr($str, 1, 1, 'UTF-8'); //按字符个数截取而非字节 
print_r(iconv_get_encoding()); //得到当前页面编码信息 
echo iconv_strlen($str, 'UTF-8'); //得到设定编码的字符串长度 
//也有这样用的 
$content = iconv("UTF-8","gbk//TRANSLIT",$content); 
?> 


iconv不是php的默认函数,也是默认安装的模块。需要安装才能用的。 
如果是windows2000+php,你可以修改php.ini文件,将extension=php_iconv.dll前的";"去掉,同时你要copy你的原php安装文件下的iconv.dll到你的winnt/system32下(如果你的dll指向的是这个目录) 
在linux环境下,用静态安装的方式,在configure时加多一项 --with-iconv就可以了,phpinfo看得到iconv的项。(Linux7.3+Apache4.06+php4.3.2), 

下载:ftp://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.8.tar.gz 
安装: 
#cp libiconv-1.8.tar.gz /usr/local/src 
#tar zxvf lib* 
#./configure --prefix=/usr/local/libiconv 
#make 
#make install 
编译php 
#./configure --prefix=/usr/local/php4.3.2 --with-iconv=/usr/local/libiconv/ 
使用的简单例子: 

<?php 
echo iconv("gb2312","ISO-8859-1","我们"); 
?>

PHP中的mb_convert_encoding与iconv函数介绍 

mb_convert_encoding这个函数是用来转换编码的。原来一直对程序编码这一概念不理解,不过现在好像有点开窍了。 
不过英文一般不会存在编码问题,只有中文数据才会有这个问题。比如你用Zend Studio或Editplus写程序时,用的是gbk编码,如果数据需要入数据库,而数据库的编码为utf8时,这时就要把数据进行编码转换,不然进到数据库就会变成乱码。 

mb_convert_encoding的用法见官方: 
http://cn.php.net/manual/zh/function.mb-convert-encoding.php 

做一个GBK To UTF-8 
< ?php 
header("content-Type: text/html; charset=Utf-8"); 
echo mb_convert_encoding("妳係我的友仔", "UTF-8", "GBK"); 
?> 

再来个GB2312 To Big5 
< ?php 
header("content-Type: text/html; charset=big5"); 
echo mb_convert_encoding("你是我的朋友", "big5", "GB2312"); 
?> 
不过要使用上面的函数需要安装但是需要先enable mbstring 扩展库。 

PHP中的另外一个函数iconv也是用来转换字符串编码的,与上函数功能相似。 

下面还有一些详细的例子: 
iconv — Convert string to requested character encoding 
(PHP 4 >= 4.0.5, PHP 5) 
mb_convert_encoding — Convert character encoding 
(PHP 4 >= 4.0.6, PHP 5) 

用法: 
string mb_convert_encoding ( string str, string to_encoding [, mixed from_encoding] ) 
需要先enable mbstring 扩展库,在 php.ini里将; extension=php_mbstring.dll 前面的 ; 去掉 
mb_convert_encoding 可以指定多种输入编码,它会根据内容自动识别,但是执行效率比iconv差太多; 


string iconv ( string in_charset, string out_charset, string str ) 
注意:第二个参数,除了可以指定要转化到的编码以外,还可以增加两个后缀://TRANSLIT 和 //IGNORE,其中 //TRANSLIT 会自动将不能直接转化的字符变成一个或多个近似的字符,//IGNORE 会忽略掉不能转化的字符,而默认效果是从第一个非法字符截断。 
Returns the converted string or FALSE on failure. 


使用: 

发现iconv在转换字符”—”到gb2312时会出错,如果没有ignore参数,所有该字符后面的字符串都无法被保存。不管怎么样,这个”—”都无法转换成功,无法输出。 另外mb_convert_encoding没有这个bug. 

一般情况下用 iconv,只有当遇到无法确定原编码是何种编码,或者iconv转化后无法正常显示时才用mb_convert_encoding 函数. 

from_encoding is specified by character code name before conversion. it can be array or string - comma separated enumerated list. If it is not specified, the internal encoding will be used. 
/* Auto detect encoding from JIS, eucjp-win, sjis-win, then convert str to UCS-2LE */ 
$str = mb_convert_encoding($str, “UCS-2LE”, “JIS, eucjp-win, sjis-win”); 
/* “auto” is expanded to “ASCII,JIS,UTF-8,EUC-JP,SJIS” */ 
$str = mb_convert_encoding($str, “EUC-JP”, “auto”); 

例子: 
$content = iconv(”GBK”, “UTF-8″, $content); 
$content = mb_convert_encoding($content, "UTF-8″,"GBK"); 

php中使用iconv函数时容易忽略的参数 
今天在处理抓取内容的时候,当采用iconv进行编码转换的时候,发现结果会中断,猜是字符集的问题,考虑怎么跳过目标字符集不存在的字符,查手册发现iconv的函数只有三个参数,好像不行,然后查网上有人说可以,但是很奇怪怎么实现,最后发现英文描述有说可以加标识到目标编码后面:“TRANSLIT”,很郁闷怎么加呢?原来是先加“//”,真是郁闷,竟然有这样的设计 
原型: $txtContent = iconv("utf-8",'GBK',$txtContent); 

特殊参数:iconv("UTF-8","GB2312//IGNORE",$data) 


两个可选的辅助参数:TRANSLIT和IGNORE ,(其中IGNORE 就是说遇到无法转换的就跳过)。 Description 

string iconv ( string in_charset, string out_charset, string str ) 

Performs a character set conversion on the string str from in_charset to out_charset. Returns the converted string or FALSE on failure. 

If you append the string //TRANSLIT to out_charset transliteration is activated. This means that when a character can't be represented in the target charset, it can be approximated through one or several similarly looking characters. If you append the string //IGNORE, characters that cannot be represented in the target charset are silently discarded. Otherwise, str is cut from the first illegal character.

转载于:https://www.cnblogs.com/sanwenyu/p/4729017.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273058.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php遍历视频文件,php使用glob函数遍历文件和目录详解

php glob()函数返回匹配指定模式的文件名或目录。因此我们可以使用glob函数来查找文件&#xff0c;也可以实现目录的遍历。函数说明&#xff1a;array glob ( string $pattern [, int $flags ] )功能&#xff1a;寻找与模式匹配的文件路径,返回包含匹配文件(目录)的数组(注&…

GitHub 建立远程仓库

终端所有信息: Last login: Fri Aug 14 08:58:01 on console wuxiaoyuan:~ lan$ ls -al ~/.ssh ls: /Users/lan/.ssh: No such file or directory wuxiaoyuan:~ lan$ mkdir .ssh wuxiaoyuan:~ lan$ cd /Users/lan/.ssh wuxiaoyuan:.ssh lan$ ssh-keygen -t rsa -b 4096 -C &qu…

朱建辉php,朱建辉/laravel-bjyblog

链接简介这个项目是把 thinkphp-bjyblog 用 laravel 框架重构后的产物&#xff1b;下图中的白俊遥博客即是使用 laravel-bjyblog 开发的个人博客安装使用可以通过以下两种命令安装&#xff1b;composer create-project baijunyao/laravel-bjyblog blog && cdblog &…

matlab 棍,双足机器人行走棍图怎么用MATLAB画出来

匿名用户1级2016-05-25 回答The following is a function I wrote to generate a stick diagram of robot motion. Hope it is helpful to you all.function stick(filename,user_frame_per_second,max_step)global robotfoot2;mov_traj load(filename);dt mov_traj(2,1) - …

设计模式学习笔记-观察者模式

1. 概述 有时被称作发布/订阅模式&#xff0c;观察者模式定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时&#xff0c;会通知所有观察者对象&#xff0c;使它们能够自动更新自己。 2. 解决的问题 将一个系统分割…

Handler与多线程

1、Handler介绍 在Android开发中&#xff0c;我们常会使用单独的线程来完成某些操作&#xff0c;比如用一个线程来完成从网络上下的图片&#xff0c;然后显示在一个ImageView上&#xff0c;在多线程操作时&#xff0c;Android中必须保证以下两点&#xff1a; &#xff08;1&…

oracle read only 事务,oracle set transaction read only与dbms_transaction实现事务transaction控制...

SQL> show userUser is "SYS"SQL> set transaction read only;Transaction setSQL> insert into t_table values(3);1 row insertedSQL> commit;Commit complete---sys用户 set transaction read only不生效SQL> select * from t_table;A------------…

oracle report builder 6i下载,oracle report builder 6i - 数据模型中的SQL查询代码

我是Vijetha&#xff0c;我正在研究报告6i&#xff0c;我很陌生 . 我有以下查询 .在front_end中&#xff0c;在Reports Parameter中&#xff0c;当用户单击“运行”按钮时&#xff0c;它将询问START_DATE和END_DATE输入 .如果用户提供START_DATE和END_DATE或者不提供输入&#…

HTML/CSS/JavaScript学习总结(转)

HTML 网站开发的主要原则是&#xff1a; – 用标签元素HTML描述网页的内容结构&#xff1b; – 用CSS描述网页的排版布局&#xff1b; – 用JavaScript描述网页的事件处理&#xff0c;即鼠标或键盘在网页元素上的动作后的程序 HTML&#xff08;Hyper Text Mark-up Language 超文…

oracle引用vs,VS2013中使用oracle,有关引用哪个.dll

Oracle、Microsoft 和第三方供应商都提供了针对 Oracle 产品进行了优化的数据供应程序。 Oracle 和 Microsoft 免费提供其 Oracle 数据供应程序。访问 Oracle 的操作有些类似于对 Sql Server 的操作。对Oracle 的访问有以下几种数据提供程序。 Microsoft.NET Oracle 提供程序 O…

贪心方法

1.背包问题 按效益值/重量 进行排序输入 2.带限期的作用排序 按效益值进行排序输入 3 最小生成树&#xff1a; 贪心方法&#xff1a;每次计入成本最小的边 原树T&#xff0c; 欲构造的最小生成树T Prim&#xff1a; 从T中选与T中结点相连的成本最小的边。 且&#xff1a;边之前…

oracle语法官方文档,Oracle官方文档必备语法知识

很多Oracle DBA虽然接触Oracle时间很长&#xff0c;但是一旦想不起语法或找不出相应参数时&#xff0c;习惯百度或谷歌。虽然已经下载了官方文档&#xff0c;但是Oracle官方文档必备语法知识[日期&#xff1a;2015-04-21]来源&#xff1a;Linux社区作者&#xff1a;kuqlan[字体…

新中大oracle实列名,新中大财务软件操作流程(完整版)

新中大财务软件最基本的三个模块&#xff1a;核算单位、财务处理系统、报表处理系统。简单地说&#xff0c;核算单位模块是用于建账&#xff0c;财务处理系统用于登账&#xff0c;报表处理系统用于出报表的。一、总账处理系统1、建账套双击财务软件图标 → 在登录界面选择用户编…

编写DLL所学所思(1)——导出函数

烛秋 http://www.cnblogs.com/cswuyg/archive/2011/09/30/dll.html 动态链接库的使用有两种方式&#xff0c;一种是显式调用。一种是隐式调用。 &#xff08;1&#xff09; 显式调用&#xff1a;使用LoadLibrary载入动态链接库、使用GetProcAddress获取某函数地址。 &am…

linux切换任务命令,Linux top详解之交互命令、命令行选项

top交互命令我们之前说过top是一个交互命令。上一节我们已经遇到了一些命令。这里我们会探索更多的命令。2.1 ‘h’: 帮助首先&#xff0c;我们可以用’h’或者’?’显示交互命令的帮助菜单。2.2 “或者”: 刷新显示top命令默认在一个特定间隔(3秒)后刷新显示。要手动刷新&am…

linux 内核地址随机化,GNU/Linux内核的地址随机化

地址空间布局随机化(ASLR)是一项增加安全性的技术&#xff0c;***者发现漏洞之后开始编写exploit时如果要考虑绕过ASLR这会增加编写exploit的难度&#xff0c;最早是2001年Grsecurity社区(强悍的社区&#xff0c;直到今天还在为各种各样的加固为自由软件安全社区作出持续而杰出…

Yii2的一些问题

Yii2中删除能不能串着用 Yii2中find、findAll有什么区别 Yii2中User::findOne($id)和User::find->where([id>1])->one; 会员登录信息 是以什么样的形式存放在Yii::$app->user->identity 里面的&#xff1f; session的形式 http://www.cnblogs.com/kuyuecs/archi…

linux系统硬盘设置密码,LUKS:Linux下磁盘加密

Linux下磁盘加密LUKS(Linux Unified Key Setup)为Linux硬盘加密提供了一种标准&#xff0c;它不仅能通用于不同的Linux发行版本&#xff0c;还支持多用户/口令。因为它的加密密钥独立于口令&#xff0c;所以如果口令失密&#xff0c;我们可以迅速改变口令而无需重新加密真个硬盘…

Hibernate查询

9.1 Hibernate数据查询 数据查询与检索是Hibernate的一个亮点。Hibernate的数据查询方式主要有3种&#xff0c;它们是&#xff1a; l Hibernate Query Language&#xff08;HQL&#xff09; l Criteria Query l Native SQL 下面对这3种查询方式分别进…

linux x86 io端口映射,linux中的 IO端口映射和IO内存映射

下面是今天看到两篇关于linux中的 IO端口映射和IO内存映射的文章,时间关系,没来得及深入理解,有空好好看看CPU地址空间CPU地址空间(一)地址的概念1)物理地址&#xff1a;CPU地址总线传来的地址&#xff0c;由硬件电路控制其具体含义。物理地址中很大一部分是留给内存条中的内存…