2006年4月19日星期三

PHP读MYSQL中文乱码的解决方法

  打算切换某个网站的主机,没想到遇到Php和Mysql中文乱码的问题。

  以前的国外主机用的Mysql是4.x系列的,感觉还比较好,都无论GBK和UTF-8都没有乱码,没想到新的主机的Mysql是5.0版本的,导入数据后,用Php读出来全是问号,乱码一片,记得我以前也曾经有过一次切换出现乱码的经验,原因肯定是Mysql版本之间的差异问题。

  只好查资料,发现了一个解决方法,就是在mysql_connect后面加一句SET NAMES UTF8,即可使得UTF8的数据库消除乱码,对于GBK的数据库则使用SET NAMES GBK,代码如下:

$mysql_mylink = mysql_connect($mysql_host, $mysql_user, $mysql_pass);
mysql_query("SET NAMES 'GBK'");

2006年4月18日星期二

Windows IIS下论坛静态化分析

  这两天研究Discuz 4.1,并成功地将原来一个Discuz 2.5的论坛升级到了最新版本,个人感觉这个论坛实在不错。

  我的Discuz 4.1是在Apache+Php+Mysql下运行的,并开启了Url Rewrite,之后我发现整个论坛的大部分页面都可以使用html的静态地址方式来访问,感觉真不错,Apache实在太强大了,难怪现在用Apache的站点那么多。

  IIS下能否也实现这种静态化功能呢,我知道Helicon开发了一个叫ISAPI_Rewrite的ISAPI程序,可以在IIS下实现Url Rewrite功能,不过我自己还没有尝试过,过两天按照下面的操作测试一下看看效果如何。另外,下文Discuz提供的ZIP文件里的Rewrite.dll实际上就是Helicon的ISAPI_Rewrite程序,我对Discuz做为软件开发商居然也盗版同行的软件感到遗憾。

  参考文章:Discuz!4.1.0 IIS Rewrite配置方法(转自DISCUZ会员区)

  Discuz! URL静态化功能受到论坛所在服务器环境的制约,在开启此功能之前,请根据你的Web服务器环境,选择相应的环境配置方法,以下提供的iis6下的服务器配置..其它服务器(如apache,zeus)你可以根据原理自行配置。

  1、下载IIS Rewrite模块:http://download.discuz.net/4.1.0/discuz_iis_rewrite.zip

  2、将压缩包解压到任意目录,(如:C:Rewrite)。然后打开“控制面板”-“管理工具”-“IIS信息服务管理器”-“网站”-“您的站点”-“属性”。在“ISAPI筛选器”项点击“添加”,筛选器名称填入Rewrite,可执行文件为C:RewriteRewrite.dll;

  3、重新启动IIS就可以生效了。

  通过上述配置后,您就可以在Discuz!4.1.0后台中根据需要开启影响的静态功能了。

  无:不启用URL静态化功能。

  Discuz!Archiver静态化:当论坛启用Archiver功能时,Archiver内的所有链接均采用*.html形式。

  普通页面静态化:对论坛常用页面(如forumdisplay.php、viewthread.php、viewpro.php等)进行URL静态化转换。

  Archiver和普通页面均静态化:对Archiver以及论坛常用页面(如forumdisplay.php、viewthread.php、viewpro.php等)进行URL静态化转换。

  使用注意事项:

  您可以通过系统设置中Discuz!选项来控制URL静态化的打开或关闭及其工作状态,本功能对服务器环境有特殊要求,独立主机用户需要对Web服务器增加相应的Rewrite规则,因此需要服务器权限才可使用;对于虚拟主机用户,您需要向您的空间服务商进行咨询:空间是否支持Rewrite以及是否支持对站点目录中.htaccess的文件解析,只有满足这两条件,URL静态化功能才会生效。打开URL静态化后,论坛一些常用链接会变成类似discuz/forum-1-1.html形式,如果您的服务器环境不支持或者尚未配置好,访问这些链接会出现“网页无法显示”的错误信息,论坛将无法正常访问。发生无法访问的现象时,请您进入管理后台,关闭URL静态化功能,论坛即可恢复正常状态。

  本文提供的压缩包中还有一个httpd.ini文件,该文件是rewrite规则的配置文件。内容如下(无需修改):

[ISAPI_Rewrite]
# 3600 = 1 hour

CacheClockRate 3600

RepeatLimit 32
# Protect httpd.ini and httpd.parse.errors files
# from accessing through HTTP
RewriteRule ^(.*)/archiver/([a-z0-9-]+.html)$ $1/archiver/index.php?$2
RewriteRule ^(.*)/forum-([0-9]+)-([0-9]+).html$ $1/forumdisplay.php?fid=$2&page=$3
RewriteRule ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+).html$$1/viewthread.php?tid=$2&extra=page\%3D$4&page=$3
RewriteRule ^(.*)/profile-(username|uid)-(.+).html$ $1/viewpro.php?$2=$3

2006年4月17日星期一

深圳治安的现实和思考

  每一个深圳人都有被偷的经历,对于深圳的治安,深圳人却大多有苦难言,甚至感到绝望。

  我自己做为一个深圳人最近就有切身体会,昨天下午我的太太带着儿子去南山岁宝百货购物,晚上和另外一个女伴在南山岁宝下面的肯德基吃饭,却不料在肯德基中被盗窃团伙偷的身无分文。

  当时我太太和那个女伴将提包放在座位上,吃饭的时候也一直注意着提包,这时一个男人带着一个小孩过来,说我们的孩子把他小孩的手弄伤了,然后和我太太纠缠,以转移她们的注意力,只几秒钟功夫,我太太和那个女伴的提包就趁她们不注意的时候被偷走了。

  由于岁宝的那个肯德基没有监控录像,门口也没有保安,因此她们发现被偷后一点办法都没有,她们的损失非常惨重,两人的手机、数码相机、身份证、IC卡、银行卡、信用卡、钥匙等等全部丢失,两人一共损失了数千元,当时我太太打电话给我时候,我真吃了一惊,赶快打电话将信用卡和银行卡挂失了,否则信用卡不用密码就可以刷一万多,那损失更大了。

  可悲啊,在一个连吃饭都不安全的城市里生活是一种什么样的悲哀啊。而肯德基做为一家外资企业,怎么可以连顾客安全就餐都不能保证吗?只知道赚钱吗?

  以前大街上新疆小偷多,这没办法,我们深圳人在大街上走都是眼观六路,耳听八方的,见了新疆人模样的都远远地躲避,香港的游客也是一到深圳,就立刻把背包全部背在前面,在深圳,后面背个背包满街走是个非常危险的举动。但是,如果连在肯德基吃饭也变成危险的举动的话,那么这个社会的治安就已经濒于崩溃了。

  深圳的治安为什么会这么差,我想主要原因是这个社会贫富差距悬殊、两级分化严重所造成的。

  任何一种人生道路的选择都是一种经过反复计算后的理性选择。选择打工与选择偷盗都有它的理由与成本核算。打工的收益与风险与偷盗的收益与风险经过比较后,如让人觉得更合算,那么,选择偷盗而不选择打工就是一种更好的选择。

  一个没有什么文化的人在深圳几乎没有半点立足之地,如果他们去“血汗工厂”做劳工,一个月只有600-800元,而如果他们去偷窃,一天至少也有几百元,有时可以有上千元,钱来的太快,如果偷盗被抓的几率不是很高,被抓住后所受的惩罚不是很重的话,那么,选择偷盗而不是打工就是一种理性的选择了!就建设和谐社会而言,我们当然鼓励大家都去打工,愉快的去接受资本家的剥削与栽培,而不去上街偷盗抢劫去。

  我们可以痛恨这些犯罪分子,但我们不得不承认,我们的社会实际上已经让偷盗和抢劫的风险变得很低而收益很高,实际上是在逼迫一些破产的无产者走上犯罪道路,这就是社会的冰冷而残酷的理性。

  为什么那些偷窃者得不到应有的惩罚,是我们的警察太少太无能了吗?我看不是,警察在一两天时间就可以抓住乱发文章的网民,那为什么小偷却抓不住呢?原因是什么呢?是因为小偷太多了抓不过来,还是因为抓小偷得不到物质上的收益,不如抓嫖客妓女罚款来钱快?我希望不会是这个答案。如果说我对深圳警察有什么建议的话,目前的警察队伍由于一些既得利益者的干扰,从内部改革已经是非常困难了,我建议深圳政府能从香港引入一批警察的管理人员,改造我们现有的警察队伍,将其管理制度好好地改革一下,只要深圳的治安能达到香港的一半水平,那么广大的深圳市民就应该很满意了。

2006年4月15日星期六

屏蔽百度快照的方法

  有时候,因为内容的更改或者隐私问题,我们往往不希望别人通过“百度快照”的方法查看自己网站的某一些网页,这里提供了一段让百度快照失效的代码。

  原理很简单,百度快照里面只有抓取了当前页面的文字信息,而图片和JAVASCRIPT代码还是调用远端服务器上的代码,如果你的网页里有通过.js文件的方式嵌入javascript代码,那么修改这个.js文件,在文件中加入以下代码,即可阻止别人通过百度快照查看你当前页面:

var page_url = window.location.href;
if ( page_url.indexOf("cache.baidu.com") != -1) {
top.location="http://www.williamlong.info/";  //此处地址修改为你希望转向的地址
}

  更新:由于百度改变的快照算法,不从远端服务器获取JavaScript文件,因此这个屏蔽方法目前已经失效。

Google推出在线日历

  Google即将推出在线日历服务Google Calendar,试图与雅虎广受欢迎的Web日历和微软普遍使用的Outlook程序展开竞争。

  Google Calendar(测试版)目前提供英语版。Gmail用户将在下周就能够享受这项服务。在随后的几个月内,Google将推出多种语言版本的该日历。

  Google日历采用了AJAX技术,从界面上看,Google日历的确很像微软Office中的Outlook,但是区别是,微软开发的Outlook软件已得到桌面电脑用户的广泛使用,并且微软的Office已经垄断了桌面办公软件平台。

  但微软提供的网上服务并没有Google的体验好,Hotmail功能和速度都不如Gmail,MSN搜索也不如Google搜索,Google的其他产品如Blogger、Talk、Desktop等都是直接和微软的相关产品相竞争。

  Google较早曾经收购了网络字处理软件厂商Writely公司,这是一家提供在线文本编辑服务的网站,可以让人们能够在互联网上处理办公任务,因此人们一直推测Google将创建一个与微软的Office相抗衡的基于网络的办公软件服务。

  目前Google是唯一可以挑战微软的软件公司,Google提供的各种网络服务令人爱不释手,并且Google的口碑要好于微软,Google Fans也众多,如果Google哪天真的推出一个Google Office的话,微软的噩梦就到来了。

  Google日历的网址是:http://www.google.com/calendar

2006年4月13日星期四

Google的中文名字—谷歌

  全球知名的网络搜索引擎Google昨天在北京发布其全球中文名称“谷歌”。

  据了解,这是Google第一个在非英语国家起的名字。主持发布会的Google亚太市场总监王怀南解释说,之所以给Google起一个中文名字,是因为考虑到普通老百姓的需求。“Google的名字已经很好了,对于IT工作人员来说,这是非常方便的称呼,但是我们有大量普通的老百姓在使用Google,我们必须考虑他们的感受”。

  根据Google介绍,这一名字意味着“丰收之歌”,说是用“诗意的方式”寓意了“丰富多彩的搜索体验”,因为“用户搜索的过程就是收获的过程”。

  不过我个人认为这个名字起的不怎么样,发音不好读,也没有韵律,很生硬,名称的含义解释的也很生涩,相信大多数人还是喜欢使用Google这个词。

  另外还有一段小插曲,Google的中文名本来锁定的是“谷果”与“古歌”,两位中国掌门李开复、周韶宁就坚定支持“谷果”,但被下属抨击为“更像农产品公司的招牌”,而“古歌”则被认为暮气沉沉。结果Google亚太区市场总监王怀南起的“谷歌”成为“黑马”。

  IT圈内的人士也没闲着,无聊布棉昨天就迅速地给“谷歌”编了一个段子:

  说到傍大款,雅虎中国笑了,俺们后台有杨致远、马云,还有以前的周鸿一....

  说到2.0,iask笑了,俺们获得入选web2.0百强呐;

  说到农民,中搜笑了,俺们是养猪专业户,都快3.0了;

  说到吹牛,搜狗笑了,俺们张朝阳能说会道;

  说到知识,百度笑了,俺们知道你不知道我知道;

  说到文化,Google笑了,俺们中文名叫谷歌,注意,不是伟歌。

  连岳也编写了一个段子:“谷歌”写给中国政府的保证书

  1、我们保证找不到任何色情资讯,但是结果会指向新浪社会新闻。

  2、我们保证找不到任何垃圾资讯,但是结果会指向新浪名人blog。

  3、我们保证修改搜索技术,将中国提供的官员名单等同于以下关键词——

  4、清廉、幽默、朴素、十年一衣、爱民如子、拍案而起、爱、做爱!

  5、我们保证“做爱”是百度恶意攻击的结果。

  6、我们认为,1988年之后就是1990年。

  7、我们还认为,6月3日之后当然是6月5日。

  8、我们保证找不到任何国际新闻,我们保证找不到任何敏感的国内新闻。

  9、Google商标在中国将改成“000000”。

  10、“000000”读为“谷歌”,但我们建议读为“胡哥”。

Tomcat中文乱码问题的原理和解决方法

  自从接触Java和JSP以来,就不断与Java的中文乱码问题打交道,现在终于得到了彻底的解决,现将我们的解决心得与大家共享。

  一、Java中文问题的由来

  Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,Java和JSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。

  首先Java(包括JSP)源文件中很可能包含有中文,而Java和JSP源文件的保存方式是基于字节流的,如果Java和JSP编译成class文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码。基于这种乱码,建议在Java文件中尽量不要写中文(注释部分不参与编译,写中文没关系),如果必须写的话,尽量手动带参数-ecoding GBK或-ecoding gb2312编译;对于JSP,在文件头加上<%@ page contentType="text/html;charset=GBK"%>或<%@ page contentType="text/html;charset=gb2312"%>基本上就能解决这类乱码问题。

  本文要重点讨论的是第二类乱码,即Java程序与其他存储媒介交互时产生的乱码。很多存储媒介,如数据库,文件,流等的存储方式都是基于字节流的,Java程序与这些媒介交互时就会发生字符(char)与字节(byte)之间的转换,例如从页面提交表单中提交的数据在Java程序里显示乱码等情况。

  如果在以上转换过程中使用的编码方式与字节原有的编码不一致,很可能就会出现乱码。

  二、解决方法

  对于流行的Tomcat来说,有以下两种解决方法:

  1) 更改 D:Tomcatconfserver.xml,指定浏览器的编码格式为“简体中文”:

  方法是找到 server.xml 中的

    <Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
    enableLookups="false" redirectPort="8443" acceptCount="100"
    connectionTimeout="20000" disableUploadTimeout="true" URIEncoding='GBK' />

  标记,粗体字是我添加的。

  可以这样验证你的更改是否成功:在更改前,在你出现乱码的页面的IE浏览器,点击菜单“查看|编码”,会发现“西欧(ISO)”处于选中状态。而更改后,点击菜单“查看|编码”,会发现“简体中文(GB2312)”处于选中状态。

  b)更该 Java 程序,我的程序是这样的:

public class ThreeParams extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
      response.setContentType("text/html; charset=GBK");
      ...
  } 
}

  粗体字是必需要有的,它的作用是让浏览器把Unicode字符转换为GBK字符。这样页面的内容和浏览器的显示模式都设成了GBK,就不会乱码了。