范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

学习PHP中的iconv扩展相关函数

  想必 iconv 这个扩展的相关函数大家多少都接触过,做为 PHP 的默认扩展它已经存在了很久,也是我们在操作字符编码时经常会使用的函数。不过除了 iconv() 这个函数外,你还知道它的其它函数吗?今天,我们就来学习一下 iconv 扩展中的各种好玩的函数。iconv 设置及获取信息
  首先,就是我们可以设置 iconv 扩展中默认定义的输出和输出字符编码格式。iconv_set_encoding("internal_encoding", "UTF-8"); // Deprecated: iconv_set_encoding(): Use of iconv.internal_encoding is deprecated iconv_set_encoding("output_encoding", "ISO-8859-1"); // Deprecated: iconv_set_encoding(): Use of iconv.output_encoding is deprecated var_dump(iconv_get_encoding()); // array(3) { //     ["input_encoding"]=> //     string(5) "UTF-8" //     ["output_encoding"]=> //     string(10) "ISO-8859-1" //     ["internal_encoding"]=> //     string(5) "UTF-8" //   }
  iconv_set_encoding() 接收两个参数,一个是设置的属性类型,一个是设置的编码格式。属性类型包括 internal_encoding 、 input_encoding 和 output_encoding ,分别代表内部的、输入的、输出的编码格式。在这段测试代码中,我们将 internal_encoding 设置为 UTF8 ,将 output_encoding 设置为 ISO-8859-1 ,然后使用 iconv_get_encoding() 打印出当前环境中相关的 iconv 属性设置信息,可以看到,在默认情况下当前环境中的 input_encoding 也是 UTF8 格式。
  不过需要说明的是,iconv_set_encoding() 已经是不推荐使用的函数了,或者说不推荐使用这个函数来设置上面的三种属性类型,它们会报出过时警告信息。现在更推荐直接使用 php.ini 中的 default_charset 来进行设置。iconv 根据编码获取字符长度、指定位置及截取字符串
  在面对中文字符串的操作时,我们使用默认的 strlen() 之类的函数返回的中文字符长度是不正确的,这就牵涉到编码的问题。一般情况下,UTF8 是占三个字节,而 GBK 是占两个字节,所以说一个汉字对于 strlen() 来说如果是在 UTF8 环境中会返回 3 。当然,现在大多数情况下我们会使用 MB 库扩展的相关函数来处理这种问题,不过 iconv 也为我们提供了几个用于字符串操作的函数。echo iconv_strlen("测试长度测试长度"), PHP_EOL; // 8 echo iconv_strlen("测试长度测试长度", "ISO-8859-1"), PHP_EOL; // 24 echo iconv_strlen("测试长度测试长度", "GBK"), PHP_EOL; // 12  echo "======", PHP_EOL;  echo iconv_strpos("测试长度测试长度", "长"), PHP_EOL; // 2 echo iconv_strpos("测试长度测试长度", "长", 0, "ISO-8859-1"), PHP_EOL; // 6 echo iconv_strpos("测试长度测试长度", "长", 0, "GBK"), PHP_EOL; //   echo "======", PHP_EOL;  echo iconv_strrpos("测试长度测试长度", "长"), PHP_EOL; // 6 echo iconv_strrpos("测试长度测试长度", "长", "ISO-8859-1"), PHP_EOL; // 18  echo "======", PHP_EOL;  echo iconv_substr("测试长度测试长度", 2, 4), PHP_EOL; // 长度测试 echo iconv_substr("测试长度测试长度", 6, 12, "ISO-8859-1"), PHP_EOL; // 长度测试 echo iconv_substr("测试长度测试长度", 3, 6, "GBK"), PHP_EOL; // 长度测试
  iconv_strlen() 就是获取字符串长度的,如果不给第二个参数就按默认的字符集编码来获取字符串长度。在测试代码中可以看出,同样八个中文字的内容,使用不同的编码返回的数量是不相同的。在这里,我们发现 iconv 中对于 GBK 的中文是 1.5 个字节,也就是 8 个中文字占用了 12 个字节的长度。
  iconv_strpos() 和 iconv_strrpos() 和 strpos() 的作用一样,返回某个字符第一次出现的位置,一个是从前往后(从左往右),另一个是从后往前(从右往左)。它们的第三个参数是偏移量,也就是查找到指定字符后再偏移几个单位。从这里我们可以看出,对于 GBK 编码的操作是有问题的,因为在 iconv 中,GBK 是 1.5 个字节,这样会带来单个字符无法定位的问题。
  iconv_substr() 很明显地就是截取字符串的函数了,同样我们要根据编码格式来指定它的截取位置。iconv 转换字符编码
  接下来就是本尊 iconv() 函数的使用的了,其实它反而没什么可讲的,将指定的编码转换成另外一种编码而已,相信这个函数大家都不陌生。$phone = file_get_contents("https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13888888888");  print_r($phone); // __GetZoneResult_ = { //     mts:"1388888", //     province:" ", //     catName:" й ƶ ", //     telString:"13888888888", //         areaVid:"30515", //         ispVid:"3236139", //         carrier:" ƶ " // }  print_r(iconv("GBK", "UTF-8", $phone)); // __GetZoneResult_ = { //     mts:"1388888", //     province:"云南", //     catName:"中国移动", //     telString:"13888888888", //         areaVid:"30515", //         ispVid:"3236139", //         carrier:"云南移动" // }  print_r(iconv("GBK", "ISO-8859-1//IGNORE", $phone)); // __GetZoneResult_ = { //     mts:"1388888", //     province:"", //     catName:"", //     telString:"13888888888", //         areaVid:"30515", //         ispVid:"3236139", //         carrier:"" // }
  我们找到的这个淘宝用于查找手机号相关信息的开放接口,返回的正好是 GBK 类型的数据。当我们直接打印结果时,在 UTF8 环境下它就会输出乱码信息。这时,我们通过 iconv() 函数就能够轻松地将编码转换成 UTF8 格式,并正确打印出了结果。第三个测试中,我们在要转换到的字符集编码类型后面加上了 //IGNORE ,目的就是忽略无法转换的内容,所以可以看出在最后我们转换到错误的 ISO-8859-1 时,中文信息就全都没有了,因为它们无法转换就被忽略掉了。mime 邮件头操作
  最后我们再看一个非常不常用的内容,那就是 iconv 还可以直接转换 mime 头中的编码内容信息。这个 mime 头信息其实就是标示当前文件或者内容的 mime 类型。平常我们会根据它来判断上传的文件是否正确,除些之外,在邮件发送中,这个 mime 头的使用也非常广泛。如果做过邮件发送接收相关的开发并且抓过包的同学一定见过下面的内容。headers_string = << Received: from localhost (localhost [127.0.0.1]) by localhost     with SMTP id example for ;     Thu, 1 Jan 1970 00:00:00 +0000 (UTC)     (envelope-from example-return-0000-example=example.com@example.com) Received: (qmail 0 invoked by uid 65534); 1 Thu 2003 00:00:00 +0000 EOF;
  Subject 字符就是邮件的标题,To 就是发送人的邮件地址。在这里我们主要看一下 Subject 的内容,它的开头就有一段描述这个字段使用的编码信息的内容,?UTF-8 ,然后后面是一堆看不懂的东西。其实我们简单地能看出来这是一个 base64 编码的内容,如果将它解码在对应的编码内容下就能看到原文信息。不过,这个时候我们也可以使用 iconv 来直接转换它的编码。$headers =  iconv_mime_decode_headers($headers_string, 0, "ISO-8859-1"); var_dump($headers); // array(5) { //     ["Subject"]=> //     string(15) "Pr fung Pr fung" //     ["To"]=> //     string(19) "example@example.com" //     ["Date"]=> //     string(30) "Thu, 1 Jan 1970 00:00:00 +0000" //     ["Message-Id"]=> //     string(21) "" //     ["Received"]=> //     array(2) { //       [0]=> //       string(204) "from localhost (localhost [127.0.0.1]) by localhost with SMTP id example for ; Thu, 1 Jan 1970 00:00:00 +0000 (UTC) (envelope-from example-return-0000-example=example.com@example.com)" //       [1]=> //       string(57) "(qmail 0 invoked by uid 65534); 1 Thu 2003 00:00:00 +0000" //     } //   }
  看到了么?不仅直接转了编码,而且还将 mime 头格式转换成了 PHP 中的数组格式。当然,我们这里测试的代码是将正常的内容转换到 ISO-8859-1 了,反而是出现了乱码。下面我们再拿一个中文邮件的例子来看下。$headers_string = << Delivered-To: bhw98@sina.com Received: (qmail 75513 invoked by alias); 20 May 2002 02:19:53 -0000 Received: from unknown (HELO bluesky) (61.155.118.135)     by 202.106.187.143 with SMTP; 20 May 2002 02:19:53 -0000 Message-ID: <007f01c3111c$742fec00$0100007f@bluesky> From: "=?gb2312?B?wLbAtrXEzOwNCg==?="  To: "bhw98"  Cc:  Subject: =?gb2312?B?ztK1xLbgtK6/2rPM0PI=?= Date: Sat, 20 May 2002 10:03:36 +0800 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_007A_01C3115F.80DFC5E0"  EOF; $headers =  iconv_mime_decode_headers($headers_string, 0, "UTF-8"); var_dump($headers); // array(11) { //     ["Return-Path"]=> //     string(21) "" //     ["Delivered-To"]=> //     string(14) "bhw98@sina.com" //     ["Received"]=> //     array(2) { //       [0]=> //       string(58) "(qmail 75513 invoked by alias); 20 May 2002 02:19:53 -0000" //       [1]=> //       string(101) "from unknown (HELO bluesky) (61.155.118.135) by 202.106.187.143 with SMTP; 20 May 2002 02:19:53 -0000" //     } //     ["Message-ID"]=> //     string(40) "<007f01c3111c$742fec00$0100007f@bluesky>" //     ["From"]=> //     string(38) ""蓝蓝的天 //   " " //     ["To"]=> //     string(24) ""bhw98" " //     ["Cc"]=> //     string(21) "" //     ["Subject"]=> //     string(21) "我的多串口程序" //     ["Date"]=> //     string(31) "Sat, 20 May 2002 10:03:36 +0800" //     ["MIME-Version"]=> //     string(3) "1.0" //     ["Content-Type"]=> //     string(16) "multipart/mixed;" //   }
  这个中文邮件 mime 头的 Subject 指定的是 GB2312 。通过 iconv_mime_decode_headers() 函数我们将整个头信息中的内容都转换成了 UTF8 ,这时就可以正常显示所有的内容信息了。当然,我们也可以对单个的 mime 字段进行转码。echo iconv_mime_decode("Subject: =?gb2312?B?ztK1xLbgtK6/2rPM0PI=?=", 0, "UTF-8"), PHP_EOL; // Subject: 我的多串口程序
  除了对于接收的信息进行编码转换之外,我们还可以自己编码相关的内容进行发送使用。$preferences = array(     "input-charset" => "UTF-8",     "output-charset" => "GBK",     "line-length" => 76,     "line-break-chars" => " " ); $preferences["scheme"] = "Q"; echo iconv_mime_encode("Subject", "测试头", $preferences), PHP_EOL; // Subject: =?GBK?Q?=B2=E2=CA=D4=CD=B7?= $preferences["scheme"] = "B"; echo iconv_mime_encode("Subject", "测试头", $preferences), PHP_EOL; // Subject: =?GBK?B?suLK1M23?=
  iconv_mime_encode() 函数就是用于进行 mime 头编码的函数。第一个参数是 mime 字段名,第二个参数是字段值,第三个函数就是我们进行编码的参数了。编码参数的内容通过字段名就可以看出来,从什么编码转换成什么编码,行的长度多少,换行符是什么。另外它还有一个 scheme 字段,就是用于指定编码结果的类型,如果设置的是 B ,那么编码结果就会再加一层 base64 操作。总结
  是不是感觉奇怪的小姿势又增加了呀?没错,在没刷文档之前我也只知道一个 iconv 而已。甚至在学习了这些内容之后我才发现了邮件信息原来是这样编码的,自己都感觉自己一下子高大上了。好了,不说废话了,自己动手试试吧!
  测试代码:
  https://github.com/zhangyue0503/dev-blog/blob/master/php/202011/source/2.学习PHP中的iconv扩展相关函数.php
  参考文档:
  https://www.cnblogs.com/onelikeone/p/7865596.html
  https://www.php.net/manual/zh/book.iconv.php

看电视次数越来越少,为什么还有人花1万多买高端电视?只因这5点家居编辑美家指南客厅中的电视,在以前的时候是家居生活的标配。而随着科技的发展,移动互联网让智能手机越来越普及,所以很多人以为智能手机正在逐渐替代掉传统的大屏幕电视。实际上仔细观察一美股暴跌了A股不开门,只能看看美股,今晚纳斯达克被爆锤,目前跌2。20。主要原因是互联网巨无霸Facebook暴跌24,对了,现在它改名叫Meta了。4万多亿市值的巨无霸跌成这个样子,非常罕美国媒体爆料,法拉第可能卖不出一辆车,贾跃亭被认定是骗子?2017年,乐视系崩盘。贾跃亭于当年7月份远赴美国造车,至今未归!说句实话,这几年但凡是贾跃亭的新闻,基本上都是负面的。为何呢?因为在大部分人眼中,贾跃亭俨然成为了一个骗子。都说阿冬奥会未赠送万物互联的国产手机华为鸿蒙失去一次难得的突围机会没有向运动员赠送万物互联的国产手机华为鸿蒙正失去一次难得的突围机会智能床炒菜机器人送餐机器人防疫机器人一系列奥运黑科技,给如同刘姥姥进大观园的外国运动员们带来了当惊世界殊的惊叹!但购买家庭影院之前,先了解这些。(杜比篇)虽然我之前在视频中简单说过环绕声格式的进化过程。但我还是要将格式的进化历史写清楚一点,如果你打算购买家庭影院,最好先看看这些标准,别2022年了,还买到几十年前的老技术。首先出场的买冰箱都有什么小技巧?我是乡哈人阿欧,很高兴回答你问题。以前作为电器销售的我告诉你,可以从以下几个方面考虑。1,尺寸。冰箱有很多种类,每个种类尺寸都不一样大,选择冰箱应该比预留空间要稍微小点,因为冰箱需iPhone为什么不建议买64G,过来人告诉你无非就三点强烈不建议买64GBiPhone的3个理由,过来人真的淘汰了64GB存储空间够不够用?这是一个很久远的问题。安卓手机厂商是从2019年开始,才在旗舰机上标配128GB闪存的,比如小对标AppleWatch?Meta首款智能手表曝光,可拍照还可拆卸Facebook母公司改名为Meta后,重心转向了元宇宙,为了向目标靠拢,除了构建软件生态,也在加速科技硬件的开发,目前已初现成果。2021年9月,Meta就与雷朋合作推出了Ray春节值得入手的5部旗舰,最低1799,骁龙870E4屏,买对不吃亏春节想要换新机的选择很多,除了新发布的骁龙8旗舰之外,还有去年的骁龙870旗舰。只是骁龙8太不给力,大都锁频限温,实际表现不如骁龙870旗舰。骁龙870其实就是骁龙865的升级版,把公益事业当生意做!公益巨头水滴筹,为何摇身一变成了赚钱利器他是美团10号员工,与王兴一起将美团发展壮大,作为联合创始人创建了美团外卖。在美团前途无量的他毅然辞职,开启创业之路。在2016年创立了水滴公司,之后又打造了朋友圈人人皆知的水滴筹法拉第未来投资者声明中存在不一致之处贾跃亭降薪南方财经2月2日电,贾跃亭旗下的法拉第未来今日宣布完成特别委员会的调查,称特别委员会确实发现,在向投资者发布的声明中存在某些不一致之处,公司控制和文化方面存在某些弱点。同时,法拉第
EK推出多功能螺丝刀官方指导价格19。9欧元水冷散热器制造商EK最近推出了一套螺丝刀,装电脑的好帮手,官方指导价格为19。9欧元。跟他家的散热器比起来,这玩意真心不贵。对了,它是咱中国制造的!这款多功能螺丝刀采用了耐用磨砂铝雷神ZEROAMD版挑战十款游戏大作之永劫无间极富个性化的外观设计前卫的造型,这就是雷神最近全新推出的旗舰游戏本ZERO,它采用了完全自主设计的模具,独创的启世设计语言颇具科技美学,还拥有活力四射的魅影橙和沉稳内敛的银翼灰两种TypeC七合一拓展坞直击痛点的高效办公娱乐利器TypeC七合一拓展坞直击痛点的高效办公娱乐利器优点小巧便携接口丰富兼容广泛核心参数拉满屏蔽罩设计给产品加分缺点TypeC插头有局限性,可随产品增送一条USBTypeC母座转接线,VivoX系列将引入京东方柔性屏?一加9RT配置曝光VivoX系列据悉走量机将采用京东方高素质柔性屏,国产屏幕即将崛起?相比三星的钻石屏幕,国产屏目前还是有点差距,主要是在屏幕激发亮度可视角度偏色低亮度均一性等上的差距。目前,国产屏iPhone13系列要来了?大家好,我是小文。iPhone12系列发布至今将近一年时间,按照苹果往常的发布习惯是一年发布一个系列的新机,那么今年的iPhone13系列的发布也会在不久后与我们相见,在iPhon松下空调1。5匹R1新一级和R3新三级能效对比拆机松下空调一级能效和三级能效区别有多大,这次拆下松下R系列空调对比看下。R系列是松下最便宜的入门款变频空调,R1是新一级能效,R3是新三级能效,这次拆的都是1。5匹挂机。松下空调命名会议系统里面应该怎么选择会议麦克风?声拓电子音爵士会议系统里面应该怎么选择会议麦克风?声拓电子音爵士1。在2020年这个特殊疫情影响的时期里,正常的网络会议沟通交流显得格外重要。2020年广州宝威西科技有限公司在会议系统市场上掀起电竞玩家进阶之选联想拯救者Y27q20体验全面提升如今的游戏越做越精良,软件带动硬件已经是一个再常见不过的现象,前有玩家吐槽的显卡危机,后有吃鸡赛博朋克2077等游戏带动一大批玩家更新硬件。而除了显卡之外,显示器也是呈现游戏画面的智慧大全(四)关于3D打印机,你一直苦恼的问题是哪个?有一种关爱,叫小弘式传道授业解惑新一期的小教程又来了,今天这篇也是我们的终章,相信伙伴们看完这几篇多多少少都会有所收获,在学习的过程中,肯定也顺便知悉了很多部件的名字和作用。学会这为什么iPhone13Pro的LiDAR扫描仪可以成为它的秘密摄影武器为什么iPhone13Pro的LiDAR扫描仪可以成为它的秘密摄影武器去年,智能手机可能已经摧毁了数码单反相机,但他们的摄影创新并没有放缓iPhone13Pro有望带来下一代激光雷太赞了!华硕无畏Pro14标压锐龙版来了马上面临开学季,很多朋友不懂该如何选择一款高效办公兼得性能的本本,今天给大家评测一款,华硕无畏Pro14标压锐龙版以下是它的配置处理器R75800H主频3。2GHz加速频率4。4G