in PHP what does it mean by a function being binary-safe ?

On January 13, 2012, in php, by 校长

It means the function will work correctly when you pass it arbitrary binary data (i.e. strings containing non-ASCII bytes and/or null bytes). For example, a non-binary-safe function might be based on a C function which expects null-terminated strings, so if the string contains a null character, the function would ignore anything after it. This is [...]

localization

On October 19, 2011, in php, by 校长

原文: http://phpadvent.org/2010/localization-by-anthony-gentile 翻译:校长 RoyGu http://roygu.com 当我们创建一个网站时,一个非常重要的考虑是:网站的受众/访客。无论网站是销售商品、提供服务亦或是信息资讯,都须考虑当国外用户访问时页面如何呈现。如果他们想在你的网站上购买商品、使用服务或获取资讯,你的网站能够正常服务他们吗?应该提供正常服务吗?本地化让用户界面符合用户的预期,如:日期格式、货币以及本地语言文本。 许多以英语为母语的人并没有意识到这点,尽管英语的普及率很高,但说英语的人仍只占很小比率。这篇文章统计了世界上分布最广的语言是英语,但英语并不是人们说得最多的语言(现在排第三)。互联网上有如此多的有用信息,很大一部分不是用英文描述的。用计算机解决语言相关的问题是一件困难的事情,但是创建一个国际友好的网站并不是我们想象的那么难。虽然今天介绍的方法不能适用于10种不同语言的网站,但是对于需要提供两三种语言的网站非常有效果。比如,在美国,讲西班牙语的人数在显著增加,拥有一个能用西班牙语言交流的电子商务网站,将扩大你的潜在客户群。 在讲如何为网站实现本地化之前,我想花点时间谈论下字符编码。即使你无法预见你的网站是否需要提供本地化功能,了解字符(charsets)编码相关的知识都是非常有必要的。字符编码是用来帮助软件识别用户期望字符集的。例如,通用的ISO 8859-1字符集是西欧的通用字符集。因此,在这种字符集中可以用英文字母表示德语中的原音。但如果我在这种字符集中想显示可拉伯字符,如:ق,那么很可能会显示成� 或 Ù。这就意味着,在ISO 8859-1字符集下,不能正确识别阿拉伯字符。 一种非常友好的跨语言字符编码是兼容ASCII码的UTF-8编码,它代表Unicode字符集,特别是在传统应用中较为常见。在网站中使用UTF-8,其支持的字符非常多,能够最大地满足用户需求。为了正确地实现一种字符编码,你要确保在你整个应用中编码保持一致。如果你使用UTF-8,那么Apache、数据库 表、PHP以及PHP可用的功能和文档类型都应该设置成UTF-8。如果这些都不是一致的,你最终可能会得到不同字符编码的混合数据,这种问题即使能补救也比较困难。 // Apache httpd.conf or .htaccess // This will add a charset to the Content-Type response header. AddDefaultCharset UTF-8 // php.ini default_charset = “UTF-8″ // Example PHP function htmlentities($data, ENT_COMPAT, ‘UTF-8′); // XML <?xml version=”1.0″ encoding=”UTF-8″ ?> // HTML <meta http-equiv=”Content-Type” content=”text/html; [...]

原来method_exists等方法不区分大小写

On September 15, 2011, in php, by 校长

今天突然回头想想刚开发完项目的新功能,好像我新增的action都是以双单词出现的,如:actionNewUser,但是在Router中只是简单的对URL中action做ucfirest(strtolower($action))处理,百思不得其解,这尼玛怎么就能找到该action呢? 但是事实往往是红果果的,经过测试发现method_exits和call_user_func_array等方法不区分方名法大小写。 千言万语不如上一图: 原来是我了解得不够,下次一定记得,哈哈,还大惊小怪的!!!! 一、大小写敏感 1. 变量名区分大小写 2. 常量名默认区分大小写,通常都写为大写 3. php.ini配置项指令区分大小写 二、大小写不敏感 1. 函数名、方法名、类名 不区分大小写,但推荐使用与定义时相同的名字 2. 魔术常量不区分大小写,推荐大写 3. NULL、TRUE、FALSE不区分大小写 4. 类型强制转换,不区分大小写,包括: * (int),(integer) – 转换成整型 * (bool),(boolean) – 转换成布尔型 * (float),(double),(real) – 转换成浮点型 * (string) – 转换成字符串 * (array) – 转换成数组 * (object) – 转换成对象

PHP下载:解决中文文件名乱码

On July 29, 2011, in php, by 校长

通过把Content-Type设置为application/octet-stream, 可以把动态生成的内容当作文件来下载,相信这个大家都会。 那么用Content-Disposition设置下载的文件名, 这个也有不少人知道吧。 基本上,下载程序都是这么写的: <?php $filename = “document.txt”; header(‘Content-Type: application/octet-stream’); header(‘Content-Disposition: attachment; filename=’ . $filename); print “Hello!”; ?> 这样用浏览器打开之后,就可以下载document.txt。 但是,如果$filename是UTF-8编码的,有些浏览器就无法正常处理了。 比如把上面那个程序稍稍改一下: <?php $filename = “中文 文件名.txt”; header(‘Content-Type: application/octet-stream’); header(‘Content-Disposition: attachment; filename=’ . $filename); print “Hello!”; ?> 把程序保存成UTF-8编码再访问,IE6下载的文件名就会乱码。 FF3下下载的文件名就只有“中文”两个字。Opera 9下一切正常。 输出的header实际上是这样子: Content-Disposition: attachment; filename=中文 文件名.txt 其实按照RFC2231的定义, 多语言编码的Content-Disposition应该这么定义: Content-Disposition: attachment; filename*=”utf8”%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt” 即: filename后面的等号之前要加 * filename的值用单引号分成三段,分别是字符集(utf8)、语言(空)和urlencode过的文件名。 最好加上双引号,否则文件名中空格后面的部分在Firefox中显示不出来 [...]

有趣儿的项目lisphp

On July 26, 2011, in php, by 校长

发现一个很有趣儿的项目,lisphp:https://github.com/lunant/lisphp 用lisp模式来写PHP代码。

PHP浮点数比较不准的解决方法

On July 18, 2011, in php, by 校长

首先看一段代码: $a = 0.1; $b = 0.7; var_dump(($a + $b) == 0.8); 打印出来的值居然为 boolean false 这是为啥?PHP手册对于浮点数有以下警告信息: Warning 浮点数精度 显然简单的十进制分数如同 0.1 或 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999…。 这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数。例如,十进制的 1/3 变成了 0.3333333. . .。 所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数 那么上面的算式我们应该改写为 $a = 0.1; $b = 0.7; var_dump(bcadd($a,$b,2) == 0.8); 这样就能解决浮点数的计算问题了