检测与删除页面BOM(UTF-8)空行方法
下图是出现前面说的情况后用firebug看到的HTML代码。
图1
里面莫名其妙多出了一个空白行,而我们看源代码里面却没有。
我最常用的办法,利用php替换
BOM: 万国码档案签名 BOM (Byte Order Mark, U+FEFF)
BOM 的内容可以表示 UNICODE 是哪种编码, 但是在接收到的档案, 要拆解后写入 DB, 看到 BOM 就觉得有点 ooxx.
在 utf8_encode 看到两段程式可以来测试 写入/移除 BOM.
将写入的档案内容前加 BOM
代码如下 | 复制代码 |
<?php |
移除 BOM function
代码如下 | 复制代码 |
<?php |
由此上述 BOM = pack("CCC",0xef,0xbb,0xbf), 所以移除 BOM 的写法可用上面的 removeBOM function 或 下述其一:
■str_replace("锘�", '', $bom_content);
■preg_replace("/^锘�/", '', $bom_content);
另外看到 判断此字串是不是 UTF-8 的 function:
代码如下 | 复制代码 |
function isUTF8($string) |
linux系统中使用shell来解决
在详细讨论UTF-8编码中BOM的检测与删除问题前,不妨先通过一个例子热热身:
代码如下 | 复制代码 |
shell> curl -s http://www.111cn.net/ | head -1 | sed -n l 锘�<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> $ |
如上所示,前三个字节分别是357、273、277,这就是八进制的BOM。
代码如下 | 复制代码 |
shell> curl -s http://www.111cn.Net/ | head -1 | hexdump -C 00000000 ef bb bf 3c 21 44 4f 43 54 59 50 45 20 68 74 6d |...<!DOCTYPE htm| 00000010 6c 20 50 55 42 4c 49 43 20 22 2d 2f 2f 57 33 43 |l PUBLIC "-//W3C| 00000020 2f 2f 44 54 44 20 58 48 54 4d 4c 20 31 2e 30 20 |//DTD XHTML 1.0 | 00000030 54 72 61 6e 73 69 74 69 6f 6e 61 6c 2f 2f 45 4e |Transitional//EN| 00000040 22 20 22 68 74 74 70 3a 2f 2f 77 77 77 2e 77 33 |" "http://www.w3| 00000050 2e 6f 72 67 2f 54 52 2f 78 68 74 6d 6c 31 2f 44 |.org/TR/xhtml1/D| 00000060 54 44 2f 78 68 74 6d 6c 31 2d 74 72 61 6e 73 69 |TD/xhtml1-transi| 00000070 74 69 6f 6e 61 6c 2e 64 74 64 22 3e 0d 0a |tional.dtd">..| |
如上所示,前三个字节分别是EF、BB、BF,这就是十六进制的BOM。 注:用到了第三方网站的页面,不能保证例子始终可用。 实际做项目开发时,可能会面对成百上千个文本文件,如果有几个文件混入了BOM,那么很难察觉,如果没有带BOM的UTF-8文本文件,可以用vi杜撰几个,相关命令如下:
设置UTF-8编码:
代码如下 | 复制代码 |
:set fileencoding=utf-8 |
添加BOM:
代码如下 | 复制代码 |
:set bomb |
删除BOM:
代码如下 | 复制代码 |
:set nobomb |
查询BOM:
代码如下 | 复制代码 |
:set bomb? |
如何检测UTF-8编码中的BOM呢?
代码如下 | 复制代码 |
shell> grep -r -I -l $'^锘�' /path如何删除UTF-8编码中的BOM呢? shell> grep -r -I -l $'^锘�' /path | xargs sed -i 's/^锘�//;q' |
推荐:如果你使用SVN的话,可以在pre-commit钩子里加上相关代码用以杜绝BOM。
代码如下 | 复制代码 |
#!/bin/bash REPOS="$1" SVNLOOK=/usr/bin/svnlook for FILE in $($SVNLOOK changed -t "$TXN" "$REPOS" | awk '/^[AU]/ {print $NF}'); do |
本文用到了很多shell命令
方法三,利用ultraedit编辑器直接修改文档
把出现空行的文档另存没没有BOM的格式就行了。
下图是ultraedit保存文档时的编码格式:
图2
选择里面的UTF8-无BOM,一切解决
php中date函数可以实现日期与时间格式化显示了,这个也是我们常用到的一些实例,下面给各位朋友介绍介绍,希望此教程对大家有帮助。
time()函数
time() 函数返回当前时间的 Unix 时间戳。返回自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。
自 PHP 5.1 起在 $_SERVER['REQUEST_TIME'] 中保存了发起该请求时刻的时间戳。
代码如下 | 复制代码 |
<?php 程序运行结果: 1292984702 Wed December 22 2010 |
1292984702单位是秒,从1970 年 1 月 1 日 00:00:00到现在的秒数。
有时候我们想知道下一周的今天的一些情况,比如是几号,星期几等等,我们可以这么写:
代码如下 | 复制代码 |
<?php 程序运行结果: Now: 2010-12-22 Next Week: 2010-12-29 Wed |
date()函数
这个函数就比较熟悉了。
代码如下 | 复制代码 |
<?php echo("Result with gmdate():<br />"); 程序运行结果:
Result with gmdate(): |
所以,我们应该给一个兼容性的写法,统一使用gmdate,并手工设置当前时区,写法改进如下:
代码如下 | 复制代码 |
echo gmdate('Y-m-d H:i:s', time() + 3600 * 8); |
这样不管在Linux+Apache下还是Windows下都得到了正确的结果,当然这样写还有一个好处,当网站是面向全世界的时候,那么网站用户只要设置所在的时区,程序自动根据用户设置的时区进行时间计算,数据库中信息发布时间只存当前的time()所生成的时间,那么在中国+8时区看到的发布时间是:2007-03-14 12:15:27,那么在欧洲+2时区用户看到这个信息的发布时间是:2007-03-14 06:15:27,这样信息的时间就全部对应正确了。
一个用于社区的自定格式显示日期
代码如下 | 复制代码 |
/** * 格式化显示时间函数 * * 类似豆瓣(几秒前/几分前/今天3:50/昨天3:50/3-6) * * @param $timestamp 时间戳 必选参数,后面三个参数可选,为提高计算速度,建议直接赋值 * @param $now 当前时间戳 * @param $today 今天00:00时间戳 * @param $yesterday 昨天00:00时间戳 * @return string */ function timeshow($timestamp,$now=0,$today=0,$yesterday = 0){ if(! $timestamp){return '';} if(! $now){$now = time();} if(! $today){$today = strtotime("today");} if(! $yesterday){$yesterday = $today-86400;} $cha = $now-$timestamp; if($cha<60){ return $cha."秒前"; }elseif($cha<60*60){ $min = floor($cha/60); return $min."分钟前"; }elseif($timestamp>=$today){ return date("今天H:i",$timestamp); }elseif($timestamp>=$yesterday){ return date("昨天H:i",$timestamp); }else{ return date("m-d",$timestamp); } } |
文章最后给大家介绍一些参数
格式化方式 | 说明 |
---|---|
Y | 4位数字年,y为2位数字,如99即1999年 |
m | 数字月份,前面有前导0,如01。n 为无前导0数字月份 |
F | 月份,完整的文本格式,例如 January 或者 March |
M | 三个字母缩写表示的月份,例如 Jan 或者 Mar |
d | 月份中的第几天,前面有前导0,如03。j 为无前导0的天数 |
w | 星期中的第几天,以数字表示,0表示星期天 |
z | 年份中的第几天,范围0-366 |
W | 年份中的第几周,如第32周 |
H | 24小时格式,有前导0,h为12小时格式 |
G | 24小时格式,无前导0,g为对应12小时格式 |
i | 分钟格式,有前导0 |
s | 秒格式,有前导0 |
A | 大写上下午,如AM,a为小写 |
可选参数 timestamp 表示时间戳,默认为 time() ,即当前时间戳。
在php中json_decode()函数可以把数组与json格式的数据相互转换,但json_decode()函数只支持UTF-8与ASCII编码,如果是gkb就会出问题,下面我们来看看问题分析与解决办法。好像用json_decode()将数组/对象 序列化为JSON字符串的时候基本上只支持 UTF-8/ASCII编码。而我们有的站采用了GBK/GB2312编码,这个时候,直接使用json_encode/json_decode的时候就可能会出问题了。
代码如下 | 复制代码 |
<?php 结果 {"text":null,"status":1} |
比如转含有中文的字符字变成空(null),但有时候我们又必须得用gb编码而又要用到json_decode()转换的时候呢?什么办呢?自己昨晚写了一个不用数据库的一个添加音乐的小后台。也就是用php添加音乐,然后生成xml菜单。不用数据库那也得用一个方式来保存数据了。保存成文本的数据再可以直接拿出来用的,我想是把数组json_decode()用它转成json格式,用的时候再拿出来用它json_encode转回数组就可以了(可能最近弄js被json影响了,好像把数组序列化还有更好的方法,比如用:serialize()和unserialize()),呵呵,转正题。既然json_decode()在gb编码上转不了中文,那么我们可以先把中文转成英文编码的形式。那可以使用这个urlencode()转一下编码,再做json_decode()转换。使用的时候,再用urldecode()转成中文就可以了
代码如下 | 复制代码 |
/* |
xampp/phpMyAdmin/config.inc.php设置的密码(为空)冲突,从而使得用户无法登陆(在电脑为重新启动前能登录phpmyadmin,但是一旦机器重启后就无法登录了)。
解决办法也很简单:
1 修改xampp中关于phpmyadmin的配置文件
进入xampp的安装目录,修改xampp/phpMyAdmin/config.inc.php文件,找到并设置开始修改的密码,
例如$cfg['Servers'][$i]['password'] = '8888';
2 清除浏览器缓存,重新登录http://127.0.0.1/phpmyadmin/即可
另外,我们点击“权限”后可以看到整个数据库的用户如下,可以点击“操作”再次修改用户密码,相应地修改config.inc.php。
小结
w
其实这个就是对xampp/phpMyAdmin/config.inc.php的$cfg['Servers'][$i]['password'] = '8888';进入修改了,如果改了用户名也可以利用$cfg['Servers'][$i]['user'] = '你的用户名';这样修改哦。
cURL是php中一个很强大的功能,可以模仿各种用户请求,如模仿用户登录,发送php cookie等等操作,下面我来整理一些相关的方法与各位同学看看备注:使用curl_init函数,必须要打开这个php扩展。
1.打开php.ini,开启extension=php_curl.dll
2.检查php.ini的extension_dir值是哪个目录,检查有无php_curl.dll,没有的请下载php_curl.dll,再把php目录中的libeay32.dll,ssleay32.dll拷到c:/windows/system32里面。
最近在学习腾讯开放平台API接口的过程中,看到了一个很强大的PHP库——cURL。它是利用URL语法在命令行方式下工作的文件传输工具。这篇文章是博主直接从国外一个博客翻译过来的,原文地址是:http://codular.com/curl-with-php。这篇文章讲的很基础,但条理很清晰,知识比较系统和全面,所以转过来收藏了!(下面的有些标题是博主画蛇添足的,大家近乎可以忽略。)
1 定义:什么是cURL
cURL允许数据传输跨广泛的协议,是一个非常强大的系统。它广泛用于跨网站发送数据,包括诸如API交互和oAuth。cURL是在它的应用范围内几乎是无所不能的,从基本的HTTP请求,到更为复杂的FTP上传或封闭式HTTPS网站的交互验证。让我们一起来看看发送一个GET和POST请求和处理返回的响应的简单区别,以及一些重要的参数说明。
在我们通过一个cURL请求做任何事之前,我们首先需要初始化一个cURL的实例。我们可以通过调用函数curl_init()函数实现,它会返回一个cURL资源。该函数接收你想要发送的请求URL作为它的一个参数。在本文中,我们先不做这一步,可以在接下来的过程中用另一种方式来实现它。
2 须知:一些核心设置
一旦我们得到了一个cURL资源,我们可以开始进行一些配置,下面列出我总结的一些核心设置。
CURLOPT_RETURNTRANSFER - 返回响应作为一个字符串,而不是输出到屏幕
CURLOPT_CONNECTTIMEOUT - 连接超时的时间
CURLOPT_TIMEOUT - cURL执行的超时时间
CURLOPT_USERAGENT - 用于请求的Useragent字符串
CURLOPT_URL - 发送请求的URL对象
CURLOPT_POST - 以POST方式发送一个请求
CURLOPT_POSTFIELDS - 在POST提交的请求中的数组数据
3 创建一个配置
我们可以通过使用curl_setopt()方式创建一个配置,这个方式接受3个参数:cURL资源、设置以及设置对应的值。因此,我们可以如下所示设置我们正在发送的请求URL。
代码如下 | 复制代码 |
$curl = curl_init(); |
如上所示,当获取cURL资源时,我们可以通过传送一个参数来设置URL。
代码如下 | 复制代码 |
$curl = curl_init('http://www.111cn.net'); |
当然我们也可以通过给curl_setopt_array()函数传递一个包含变量名和变量值的数组一次性地创建多重配置。
代码如下 | 复制代码 |
$curl = curl_init(); |
4 执行请求:curl_exec()
当所有选项都配置好后,准备发送请求时,我们可以通过调用curl_exec()方式来执行这个cURL请求。这个函数将会返回三种不同的情形:
代码如下 | 复制代码 |
$result = curl_exec($curl); |
此时,$result已经包含了页面的响应——它可能是JSON,一个字符串或者一个完整的网站的HTML。
5 关闭请求:curl_close()
当你发送完一个请求并且获取到了相应的返回结果,你就需要关闭这个cURL请求以便释放一些系统资源。通过调用curl_close()方法,我们可以像其它所有需要将资源作为参数的函数一样简单实现资源的释放。
6 GET请求
GET请求是默认的请求方法,并且我们可以很直截了当的使用它。事实上所有的例子到目前为止一直都是GET请求。如果你想在请求中加入传入一些参数,那么你可以像http://testcURL.com/?item1=value&item2=value2一样把这些参数作为一个查询字符串附加在URL地址后面。
因此,我们可以通过如下示例发送一个GET请求到上面的URL中去,并且返回相应的结果。
代码如下 | 复制代码 |
// Get cURL resource |
7 POST请求
GET请求和POST请求两者之间语法的唯一区别就是:在你想要传送一些数据时,多了一个设置。我们将把CURLOPT_POST设置为true,并且通过设置CURLOPT_POSTFIELDS来传送包含一个数组的数据。
因此,如果把上面的GET请求转换为POST请求,我们可以使用下面的代码:
代码如下 | 复制代码 |
// Get cURL resource |
到这里,你就拥有了这样的一个POST请求:它将产生和上面GET请求一样的效果,并且把返回数据到脚本中,这样你就可以随便使用它们了。
发起https请求示例
代码如下 | 复制代码 |
function _https_curl_post($url, $vars) |
8 错误
尽管我们讨厌错误,但是你还是得注意使用cURL时可能出现的情形。因为你最终无法控制你所发送请求的网站,也无法保证该站点的响应结果将会是你预想的那种方式以及这个站点一直都会是正常状态。
这里提供了两个可以用来处理错误的函数:
curl_error() - 返回一个字符串错误信息(当请求正常返回时,其值为空)
curl_errno() - 返回cURL的错误数目,然后你可以查看这个包含错误代码的页面。
例如,你可以如下示例使用:
代码如下 | 复制代码 |
if(!curl_exec($curl)){ |
如果你想要任何HTTP响应代码都大于400来产生一个错误,而不是返回整个HTML页面,那么你可以把CURLOPT_FAILONERROR设置为true。cURL是一个“庞然大物”,并且还有很多很多的可能。有些网站可能为一些用户代理提供服务页面,当使用API接口时,它们可能会要求你传送一个特别的用户代理,这些都是我们需要注意的。如果你还想了解一些cURL请求,为何不尝试去oAuth with Instagram看看呢?
相关文章
- 下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
php 中file_get_contents超时问题的解决方法
file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25- 相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
- php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
- 下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
- ps软件是现在非常受大家喜欢的一款软件,有着非常不错的使用功能。这次文章就给大家介绍下ps把文字背景变透明的操作方法,喜欢的一起来看看。 1、使用Photoshop软件...2017-07-06
intellij idea快速查看当前类中的所有方法(推荐)
这篇文章主要介绍了intellij idea快速查看当前类中的所有方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-09-02- 1.在没有设置默认值的情况下: 复制代码 代码如下:SELECT userinfo.id, user_name, role, adm_regionid, region_name , create_timeFROM userinfoLEFT JOIN region ON userinfo.adm_regionid = region.id 结果:...2014-05-31
- 复制代码 代码如下: <td> <a href="/member/life/edit_ppt/<?php echo $v->id;?>" class="btn">编辑</a> <a href="javascript:;" onclick="if(confirm('您确定删除这条记录?')){location.href='/member/life/d...2014-06-07
js导出table数据到excel即导出为EXCEL文档的方法
复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta ht...2013-10-13- 批量更新mysql更新语句很简单,更新一条数据的某个字段,一般这样写:复制代码 代码如下:UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';如果更新同一字段为同一个值,mysql也很简单,修改下where即...2013-10-04
- 本文涉及的主题虽然很基础,在许多人看来属于小伎俩,但在JavaScript基础知识中属于一个综合性的话题。这里会涉及到对象属性的封装、原型、构造函数、闭包以及立即执行表达式等知识。公有方法 公有方法就是能被外部访问...2015-11-08
- ps软件是一款非常不错的图片处理软件,有着非常不错的使用效果。这次文章要给大家介绍的是ps怎么制作倒影,一起来看看设计倒影的方法。 用ps怎么做倒影最终效果̳...2017-07-06
安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法
手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21- 最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04
- 单个字符分割 string s="abcdeabcdeabcde"; string[] sArray=s.Split('c'); foreach(string i in sArray) Console.WriteLine(i.ToString()); 输出下面的结果: ab de...2020-06-25
- javascript控制页面控件隐藏显示的两种方法,方法的不同之处在于控件隐藏后是否还在页面上占位 方法一: 复制代码 代码如下: document.all["panelsms"].style.visibility="hidden"; document.all["panelsms"].style.visi...2013-10-13
连接MySql速度慢的解决方法(skip-name-resolve)
最近在Linux服务器上安装MySql5后,本地使用客户端连MySql速度超慢,本地程序连接也超慢。 解决方法:在配置文件my.cnf的[mysqld]下加入skip-name-resolve。原因是默认安装的MySql开启了DNS的反向解析。如果禁用的话就不能...2015-10-21- 本篇文章是对C#方法进行了详细的总结与介绍,需要的朋友参考下...2020-06-25
- 步骤:Window -> PHP -> Editor -> Templates,这里可以设置(增、删、改、导入等)管理你的模板。新建文件注释、函数注释、代码块等模板的实例新建模板,分别输入Name、Description、Patterna)文件注释Name: 3cfileDescriptio...2013-10-04