编程 | 想当摄影师的程序员

Category Archives: 编程

PHP substr 截取 UTF8字符串乱码的解决

PHP的substr方法可以按照字节来截取字符串, 对于英文来说是没问题的. 因为一个英文字符只占一个字节. 但是对于截取UTF8编码的中文就会存在问题. 比如: var $str = ‘我爱twitter哈哈’; echo substr($str, 0, 1); 就会出现一个乱字符, 因为在php中, utf8编码的中文是占3个字节, 单单只取一个字节肯定是不行啦. 如果: echo substr($str, 0, 3)就会出现”我” echo substr($str, 0, 9) 会出现”我爱twi” 在中英文混排的时候, 这个函数就显得无能为力了. google了一下, 发现很多人写了替代方法, 比如自己去实现一个substr, 里面写循环. 这样肯定效率低下, 直接用substr的复杂度是1, 而自己写循环, 复杂度就是n了. 后来找到了Wikipedia的条目, 发现原来3字节的utf8编码是有规律的. 一个非英文字符的3-bytes utf8 编码, 总是以224-239之间的char code开头的, 这就好办了. 思路是这样的: 先用substr截取, 判断截取结果的最后一位是不是在224-239之间, 如果是, 就说明目前取到了3-byte utf8编码的第一位, 那么只需要把计划截取的长度-1即可. 如果截取结果的最后一位之前一位在224-239之间, 就说明目前取到了3-byte utf8编码的第二位, [...]

  • Share/Bookmark

How to: Implement Dynamic Route in CakePHP

I’ve found a method to implement Dynamic Route in CakePHP. If we develop a CMS program using CakePHP, we often let people to define their menu code. The menu code basically is the URL path. For example: An admin create a menu named ‘Milk Product’, and give this menu a code ‘product’. He wish to [...]

  • Share/Bookmark

WordPress不能在别人评论后给我发送邮件的解决办法

这是一个非常诡异的问题. 遇到问题后, 我google了一下. 发现有些人遇到了和我类似的问题. 但是他们的问题原因仅仅是服务器不支持php的mail函数, 他们只需要安装wp mail smtp组件就可以发送了. 而我确定我的服务器支持mail函数. 我对于php还是新手, 还不知道怎么在windows上测试php的mail函数. 所以就只能在本地把文件改改, 然后上传到服务器上做发送邮件测试. WordPress调用的是PHPMailer组件发送邮件, 经过几个小时的调试之后, 我发现问题的原因在于2点: 1. PHPMailer的Sender属性为空. 这个属性为空将直接导致不会发送任何邮件. 2. PHPMail的MailSend方法中是这么调用mail函数的: $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params); 我注意到如果把$this->EncodeHeader($this->SecureHeader($this->Subject))替换成固定的字符串, 并且将Sender属性设置为我的email地址, WordPress就可以给我发送评论邮件了. 关于字符编码的问题我不是很懂, 大概看看这个EncodeHeader函数, 没看懂. $this->Subject的内容是”[想当摄影师的程序员] Comment: “Symbian S60 V3系统不破解也能提升权限”” 如果直接用var_dump($this->EncodeHeader($this->SecureHeader($this->Subject))), 会得到一串加了编码前缀的base64字符串. “=?utf-8?B?W+aDs+W9k+aRhOW9seW4iOeahOeoi+W6j+WRmF0gTmV3IENvbW1lbnQgT24=?= =?utf-8?B?OiBTeW1iaWFuIFM2MCBWM+ezu+e7n+S4jeegtOino+S5n+iDveaPkOWNhw==?= =?utf-8?B?5p2D6ZmQ?=” bin2hex函数可以将任意内容转换成十六进制的字符串. 于是我调用了两次bin2hex方法. var_dump(bin2hex($this->EncodeHeader($this->SecureHeader($this->Subject)))) var_dump(bin2hex(“=?utf-8?B?W+aDs+W9k+aRhOW9seW4iOeahOeoi+W6j+WRmF0gTmV3IENvbW1lbnQgT24=?= =?utf-8?B?OiBTeW1iaWFuIFM2MCBWM+ezu+e7n+S4jeegtOino+S5n+iDveaPkOWNhw==?= =?utf-8?B?5p2D6ZmQ?=”)) 发现转出来的十六进制码竟然有差别. 3d3f7574662d383f423f572b6144732b57396b2b6152684f573973655734694f6561684f656f692b57366a2b57 526d463067546d563349454e766257316c626e51675432343d3f3d0a203d3f7574662d383f423f4f694254655 731696157467549464d324d4342574d2b657a752b65376e2b53346a656567744f696e6f2b53356e2b6944766 561506b4f574e68773d3d3f3d0a203d3f7574662d383f423f35703244365a6d513f3d [...]

  • Share/Bookmark

CakePHP报500错误的解决方法

我把CakePHP做的网站传到主机上, 发现只有首页能打开. 点其他链接都报500错误. 在看不到日志的情况下问题出现的可能性是多种多样的. 后来google一下, 发现有人遇到过类似的问题, 解决方法是换个主机……. 不信邪. 首页能打开就说明我的配置没错, CakePHP是能正常运行的. 可能问题出现在URL的Rewrite上, 于是我尝试使用/index.php?url=service (注: service是controller的名字)来打开, 可以打开. 更加证实了CakePHP是没问题的想法. 于是我就修改了.htaccess. 原来内容是 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 我改成 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ /index.php?url=$1 [QSA,L] 看到吗? 我给index.php前面加了个斜线, 问题解决. 这会是一个很好的解决方法吗? 继续google, 后来在cakephp的官方网站上找到了一个方法. RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} [...]

  • Share/Bookmark

Javascript 排序问题

我们买了个web表格控件, 点击表头可以排序的, 对于英文没问题, 是按照英文字母顺序排的, 但是中文就乱了. 不按拼音顺序, 也不按笔画顺序. 后来在网上找了一下, 发现Javascript的sort方法对于中文是按照内码来排的. 如果想让其按拼音来排, 需要用localCompare 原始顺序是: 猪zhu-1,我wo-2,啊a-3,你ni-4,他ta-5,地di-6 Javascript本身的sort排序后是: 他ta-5,你ni-4,啊a-3,地di-6,我wo-2,猪zhu-1 按照拼音排序结果是: 啊a-3,地di-6,你ni-4,他ta-5,我wo-2,猪zhu-1 具体请看代码 HTML+Cheetah语言: Javascript 排序问题 <!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 http-equiv=“Content-Type” content=“text/html; charset=utf-8″ /> <title>Sort Test</title> </head> <body> <script type=“text/javascript”> function mysort() { var s = “猪zhu-1,我wo-2,啊a-3,你ni-4,他ta-5,地di-6″; alert(“The original is:\n” + s); [...]

  • Share/Bookmark

在BlueHost上安装Subversion

一开始是按照Bluehost论坛上的方法来安装, 但是发现无法支持http, https协议, 又按照半瓶墨水的方法来安装, 这次支持http协议了, 但是依然不支持https. 后来google了一下, 经过多次摸索, 终于安装成功, 下面分享经验. cd ~ mkdir install mkdir src cd src #下载 wget http://subversion.tigris.org/downloads/subversion-1.6.4.tar.gz wget http://subversion.tigris.org/downloads/subversion-deps-1.6.4.tar.gz wget http://www.openssl.org/source/openssl-0.9.8k.tar.gz tar xzvf openssl-0.9.8k.tar.gz tar xzvf subversion-deps-1.6.4.tar.gz mv subversion-1.6.4 deps tar xzvf subversion-1.6.4.tar.gz #编译OpenSSL cd openssl-0.9.8k ./config –prefix=$HOME/install/openssl make make install cd .. cd deps #编译apr cd apr ./configure –prefix=$HOME/install/apr LDFLAGS=”-L/lib64″ [...]

  • Share/Bookmark

封装YUI Table

以前做Research的时候用C#把YUI的Table封装了起来. 这里是代码, 仅供参考.

  • Share/Bookmark

Html里的标签<button>

大家一般写按钮, 都会写<input type=”button” value=”按钮文字” /> 但是还有一个标签可以用就是<button></button>, 两者功能一样, 但是button的功能更丰富 这个标签里面允许定义其他html标签作为按钮文字 例如: <button><img src=”some.gif” /></button> <button><strong>这是加粗的文字</strong></button> <button>是标准的html元素, 可以放心使用 但是<button>也有麻烦的地方, 就是用button提交form的时候不会触发form的onsubmit事件. Button的问题, 请参考深入理解 __doPostBack

  • Share/Bookmark

页面中同时存在VBScript和Javascript时请注意

当一个页面里面同事存在Javascript和VBScript的时候,我们的页面可能会发生错误,错位位置在 <body oncontextmenu=”return false;” onkeydown=”parPage.KeyControl(event)” onhelp=”parPage.goHelp(event)” bottomMargin=”2″ leftMargin=”2″ topMargin=”2″ rightMargin=”2″> 此时,当触发了oncontextmenu事件后,浏览器不知道这个return false语句到底用什么引擎来解析,所以就会出现找不到对象或者类似的莫明其妙的错误.解决办法是在事件处理前,加上语言名称前缀:javascript:return false; <body oncontextmenu=”javascript:return false;” onkeydown=”javascript:parPage.KeyControl(event)” onhelp=”javascript:parPage.goHelp(event)” bottomMargin=”2″ leftMargin=”2″ topMargin=”2″ rightMargin=”2″> 这样就不会出来那种无聊的错误了. 有人说写上这句就默认为javascript了,好像这句话不起作用 <meta name=”vs_defaultClientScript” content=”JavaScript”>

  • Share/Bookmark

jQuery基础

0. jQuery基础 jQuery是一个轻量级的javascript类库, 只有14k(未压缩的版本有77k) jQuery有什么好处呢? 我想好处有以下几点: 1. 简化了html对象的操作, 起码写的字少了, 而且原来需要自己写循环做的, 现在一句话就搞定 2. 提高了代码的浏览器兼容性. 现在的4种主流浏览器之间的js脚本或多或少都会存在兼容性问题, 用jQuery, 会让你不用关心兼容性. 比如Ajax请求, ie和firefox的对象完全不一样 还有box模型的问题, 比如一个div外面加了一个边框, 然后为这个div设定一个宽度, ie和firefox对这个div的实际宽度理解的就不一样. ie会认为div的实际宽度是div的宽度+边框宽度, 而firefox认为div的实际宽度就是你设定的宽度, 不过div的有效宽度就是div的宽度-边框宽度了, 这个问题会影响一个元素的实际位置. 所以一定要用jquery的offset方法来取元素的位置, 用width来取宽度 所有的jQuery选择器返回值都是jQuery对象, 而不是html元素. 所以一些普通的用法, 比如InnerHTML都是无效的. 更多更详细的参考请访问http://docs.jquery.com/Main_Page 别人写的基础教程 http://bbs.jquery.org.cn/frame.php?frameon=yes&referer=http%3A//bbs.jquery.org.cn/viewthread.php%3Ftid%3D129%26highlight%3D 1. 选取元素 $(“#myid”)效果等于document.getElementById(“myid”), 但是写的字符要少好多啊. 如果需要将jQuery对象转换成html元素, 则只需要取其第0个元素即可. 例如$(“#myid”)返回的是jQuery对象, 而$(“#myid”)[0]返回的就是html元素 如果选择所有的img元素, 那么这么写: $(“img”) 如果选择带有class=”TextBox”的div元素(<div class=”TextBox”></div>), 那么这么写: $(“div.TextBox”) 选择带有myattr属性的元素$(“div[myattr]“) 选择带有myattr属性, 并且属性值等于myclass的元素$(“div[myattr='myclass']“) 属性不等于[myattr!='myclass'] 属性以my开头[myattr^='my'] [...]

  • Share/Bookmark