Archive for October, 2005

鼓山一游

Monday, October 31st, 2005

周6跟甘肃来的柏总(hehe)去了趟鼓山,哇,好久没去去了。下过雨的山上满是雾水,感觉特别清新。
现在身体真的是很差了哪,爬到600米的时候就感觉累得不行,不过还是爬到涌泉寺了。。
下山还是恐怖,两脚不停的发抖,唉,两天过去了,到现在走起路来都通得不行。。。。。
发几张照片(可惜相机不大会用,图片太小了,而且我拍得特别不好,手会抖,很多都糊了):

小伙子挺帅嘛!!!!

有没点霸气??(柏总别打我!!)
不过偶地照像水平实在是差了点,让柏总失望了这次.

呀,别抓那么紧哪..

记得学生时代来这时,在这照了一张,怀旧一下,好怀念年轻的时候(heheh,现在老了),改天发一张五六年前的我在这照的对比图你就知道了。

上善若水,鼓山上的石刻很多,好不容易找到这个:

雨后鼓岭:

雨后福州一角

SyncML简介

Monday, October 31st, 2005

您是否遇到这个问题?您的手机上有个电话本,办公室PC机上有个outlook,PDA上也有个联系人,家里的电脑也是个联系列表,您是否总是烦恼于这些设备的资料不能同步,或是忙于对各个设置上的数据不停的进行同步?更或者您的手机丢了或是硬盘坏了而导致联系人资料全部丢失(!_!),那么SyncML就是为了解决这些问题而生的。
SyncML是一种 (Synchronization Markup Language)是一种平台无关的信息同步标准协议。是一种开放的标准得到的广大的设备产商的支持。现在比较多的应用于手机电话本的同步与备份上。
SyncML主要包含:设备管理协议,数据同步协议,邦定协议。
据我现在的简单了解设备管理就是指同步双方的设备能力的控制。同步协议是主要的内容就是通过定义好的消息包(SyncML,XML数据包)根据一定的顺序和操作方法进行服务器与客户端双方的数据同步,邦定就是定义了SyncML如何通过下层的标准协议进行传输(http等)。(个人初步了解得到的理解,可能不正确,欢迎指正交流)
近期关注:SyncML,Sync4J及相关内容。

奢侈了一把,买了个多普达575,呵呵

Friday, October 21st, 2005

手机丢了,其实没手机的日子还是蛮轻松的,不过有时候不大方便,手机丢了最大的损失可能是失去了那些联系的的电话吧,所以以后要搞个同步软件,经常同步。。。
买了个smartphone,多普达575,也搞了把win ce,呵呵。还带个摄像头,虽然自己也是搞电信行业的,不过对于手机的要求还是很低的,只要能打电话就行了,本来想买个几百块钱的就算了,因为毕竟只是个工具。也没打算要那种能拍照的,经女友提醒想起了在武汉时看到的一个情景,所以要了个拍照的:
记得2002的时候,还在武汉做移动的大客户系统,有一天在街上(可能是某个机关的门前),看到一个乞讨的妇人,站在那边昂起头,仰望着高高在上的卫兵,她脸上露出的那种表情和眼神,无论是我自己在瞻仰伟人时,或是电视电影里那种记念谁谁谁或是感谢谢谁谁谁所从没流露过的,虽然没有鲜花,没有泪水之类的东西,但是她的那种表情,那种情景实在是令我终身难忘记(只是当时或是现在的我无法用言语表达出那种情景),当时就说了,如果我的手机可以拍照,一定记录下来或者可以得个什么奖呢。不过现在我基本上已经忘记当时说要有个能拍照的手机了,没想到lily还记得,呵呵,想想当时的收入和当时拍照手机的价格这个想法真是有点不可企及哪,那就现在稍稍奢侈一下来实现吧。
可能不少人看过我说过很多次的底层人民的生活,可是我绝没看不起或是嘲笑的意思,而更多的是我自己确实在注意这些东西,更多的是我觉得有点心痛,有点悲伤。我们身边还有那么多过不上好日子,吃不饱的人们存在,有这些想法,因为我是农村来的,世代为农的出身以及自己年幼时的经历,让我很清楚的明白生活的艰苦和艰辛。

系统参数的使用方法

Friday, October 21st, 2005

系统参数的使用?谁都会啊,这有什么好说的。呵呵,那可不一定哪。。。
让我们来看看。。。。。。。
相信很多朋友会asp或asp.net,对于这个东西我是新手,只记得99年底的时候用这东西写用一个留言本,后来用asp.net做了个同学录,其它嘛还真没深入学习过。不过我知道asp有个application对象,依我对asp的理解这东西是我觉得asp中比较有价值的东西了,为什么呢?application对像中保存系统全局的内容,可以在多个会话间保存信息。而我见过的asp书籍中,对于application对象的使用的示例往往是用application做一下访问计数器????至少我至今没看到过哪个产品是用这种方法做流量统计的(当然也不是不可),只是我觉得如果application对象仅仅拿做计数器的话那简直就是暴殓天物啊。
上班了,晚上继续。。。。

节约内存是一种罪恶?

Friday, October 21st, 2005

节约内存是一种罪恶?
回福州几天了,有好多东西想写,可是由于一些个人问题而中断了,那怎么办呢?今天来个重量级别高一点的内容吧。这可是我花了一两年时间才明白的东西哪。。。是的,一两年。
似乎从我的第一位程序语言老师开始,任何人都这么告诉我:“写出来的程序,要跑得又快占的内存又少”,不是吗?(第一位程序老师?噢,陈老师您好!不,可能还有更早的?是的80年代的basic教程。呵呵,别说我是80年代出生的,但是我的的确确很认真的读过80年代的basic教程,虽然那时我还小)。所以现在的人们看到这种说法似乎觉得合情合理,是啊,跑得又快占的资源又少。可是这往往是做不到的,你想让马跑得又快,吃得又少或者像以前的地主们总是希望长工吃得少干得好这可能吗?有可能,不过有一个度,我们只能尽可能的把握这个度,让程序跑得足够快,又使用合理的系统资源,不是吗?但是在这硬件技术快速发展的今天,我们应该认真考虑一下是否为了节省10M的内存占用而去花费两个小时时间来优化程序。这么做似乎损失的不只是你的两个小时,还有系统的速度和稳定性,您看得没错还有“稳定性”。让我们先看看下面这则故事(如果觉得相当无趣,直接看后面的说明吧)。
记得遥远的公元2002年,程序员leo(这名字怎么这么熟悉?呵呵,是我年轻的时候)接到一个开发任务,开发一个两个系统间用户资料同步的程序,然后这个程序跑在一台hp 6000服务器(我希望您明白PC机,服务器,小型机,大型机是一个逐级上升的设备排列,虽然很长时间我并不明白。),4个intel至强CPU,3G内存,在win200系统上面跑了一个负荷很小的bea tuxedo应用服务器以及一个用以程序版本升级的ftp服务器。CPU利用率5%以下,内存占用率750M以下。leo似乎明白了要做什么,并且写出了简单的功能说明:从A系统取到用户ID,然后从B系统获取用户资料,判断资料是否相同,不同则更新A系统的用户信息。很简单是吗?是的按照leo那时的经验和想法,只花了一个半小时就用delphi写出这么个程序,一个TQuery控,从A系统的用户表中获取用户ID,有如:select msisdn from vip_users; 然后对这个ResultSet进行循环,直到eof前一直做:
1.获取当前记录用户id,既:msisdn字段。
2.从当前(A)系统获取用户资料。
3.从B系统获取当前用户资料。
4.调用或个函数或者存储过程比较两系统的资料。
5.如果资料不一致将B系统的信息更新到A系统中。
“啊哈,完成了。哥们,我写出了一个可执行程序只有500K大小,占用内存不超过20M的程序来完成这个功能。”
第二天系统上线了,30万数据的用户资料跑了5个小时完成数据同步,于是兄弟们都上前为leo祝贺,“你完成了一个伟大的功能”,“那我们让它每天晚上2点自动运行,这样早上上班的时候人们就可以看到同步后的最新信息了,真棒!”
一个月,两个月过去了,没出过任何问题,人们似乎忘记了leo曾经写过这么一个伟大的程序。而由于客户的业务开展良好,进入vip_users的用户也越来越多了,一切都是那么的美好….
一天9点半的时候,leo还在沉浸在梦中与美女相会,客户经理打来电话,“怎么回事,我们的数据与B系统中的不一致?”,“不可能,我们的同步程序每天都在定时运行”…………
———呵呵,大家不要扔砖头,我是一个很憋脚的故事作者,呵呵,第一次用这种方式写东西。。。
leo到公司查一下确实资料不是同步的,实际上同步程序还没运行完成,经过几天的观察同步程序不是在上班时间前跑不完成就是在更新过程中由于数据库(长时间连接)异常退出了。。。。
由于系统用户的增多,更新程序已经无法在5,6个小时内完成任务了,于是大家讨论出了解决方法:启多个进程每个进程更新一部分数据。
呵呵,程序还是那么的小,占用那么少的资源,只是跑多个程序,这已经足以让leo再自豪一阵子了,看我写得程序多么具有可扩展性,在不修改任何代码的情况下能适应系统的新需求。于是大家将程序复制一份修改了取资料的语句,原来的:select msisdn from vip_users; 变成了
select msisdn from vip_users where area_code in(a,b,c); 和另一份的:select msisdn from vip_users where area_code in(d,e,f);
就这样在后面的很长一段时间内,程序不停止的被拷贝,sql语句里的where子句不停的修改。因为大家都觉得这不是程序的问题,这是数据量增大的问题,因为leo的程序写得又简单占用资源又小,这完全符合老师们跟我们说的”好程序”的标准哪。
这种情况在leo离开这间公司后仍然延续着…………
好的,故事讲完了,聪明的您是否看出了leo犯的错误,是否对于故事的内容有很多疑问?是否对前面说的:“而这么做似乎损失的不只是你的两个小时,还有系统的速度和稳定性”有疑问?怎么影响稳定性了?
好,让我们看看leo离开这间公司一年后(这是真的),对于这个问题的解法:
一年后仍在维护这处系统的哥们找到leo,说“救救我吧,我被这处程序折磨的要疯了..”
leo给出了下面的解法:
1.将A系统需要同步的所有用户ID和资料全部(或部分)一次性加载到内存的链表,比如delphi中的T***List中。
2.循环链表,取得B系统中当前用户ID的资料
3.比较两系统的资料.
4a:方案一,将资料不同的记录放入需要更新的链表。(推荐)
全部比较完将需要更新的链表中的数据更新到数据库。
4b:方案二,直接更新需要同步的数据到A数据库中。
当然数据量非常大的时候把数据全部加到内存是愚蠢的,所以你可以在上面步骤的外层加一个循环,比如每次加载5万或是10万的记录到内存来处理。
非常简单的修改,带来了巨大的改变,更新速度快了,而且再没出现过更新过程由于数据库长时间连接的错误而退出的情况了,那哥们说“哈哈,我又有时间去泡武汉大学的MM了”。
这两个方法其实非常相似为什么效果有这么区大的差别呢?
首先你需要明白:
1,数据库资源是非常宝贵的。占用一个长时间的数据库连接,远比您的程序占用1G的内存来得罪恶。
2,数据库是非常慢的。(??是的,我没说错,在我们现在的系统是在IBM 690上跑的数据库,而整个系统中最慢的那些程序就是与数据库相关的程序,而这些应用往往只是做简单的插入和更新,但这并不是因为我们不懂如何使用数据库或是语句没经过优化之类的,oracle,sybase,db2很快吗?无论数据库查询或是修改速度再快您觉得它会快过链表操作或是平衡二叉树操作吗?)
3,外部系统(这个故事里指数据库),是不可控的。 您可以任意的修改您的代码,却无法修改外部系统的任何东西,哪怕只是想把某个变量声明得更可读些。甚至您根本不知道它们会在什么时间出一个什么样的错误。
第二种方法改变的只是将长时间依籁于数据库系统的操作改为依籁于应用内部资源使用的方法,这样您只是多占用一些原来就空余的内存,少占用一个长时间的数据库资源,这样您就不会由于长时间占用数据库的临时表空间,内存资源,回滚段资源,进程资源,而发生的数据库强制断开连接或是网络错误。数据库也不必长时间保存您的操作结果而不能为其它人服务了。。(您记得前面我说的3G内存只用了750M吗?)
并且由于您查询的数据全部放到您的进程地址空间,而一切都变得都由您来控制。
“但是您占用了很多内存哪?”,是占用了比原来多很多的内存,不过利用这些空闲内存解决天天烦恼您的问题,较之于闲置着几G的内存而让您天天看着系统资源利用率不到5%那种意淫得来的快感是不是舒服很多?
对于一般的系统来说:输入和输入是最不可控的,我们应当尽量减少由于输入输出而引起的软件异常对于系统处理流程的影响,最直接的做法就是限制系统中对于输入、输出的操作点和操作频率。把这种最可能出现的异常限制在最少的地方和最少的时间。
所以我们所建议的系统流程是:
1.加载系统输入数据。一次性加载全部或是一大批,而不是一次一条。
2.数据处理逻辑。这里只是在内存中处理数据,尽可能的不涉及到输入和输出操作,因为毕竟内存操作的出错可能性远比文件系统、数据库或者网络来说小得多得多。
3.处理结果输出数据。也是一次把您前一次载入的输入的处理结果输出,而不是处理一条输出一条。
从大的范围来说这种方法对于异常的处理是最经济的,对于事务完整性的处理也最简便,加载输入,处理数据和处理输出中的任何异常您都可以简单的限定在不同操作的范围内,不需要考虑单条处理过程的那种复杂的事务处理。
所以我们应该尽量多的使用系统空闲资源(你知道为什么用top之类的命令看linux[或者说unix like]系统的资源利用率总是很高吗?),忘记了老师教给你的“吃得又少跑得又快”的马吧。
因为浪费系统资源,节约内存是一种罪恶。
当然本文讨论的内容并不适合所有情况,大家仁者见仁,智者见智吧,当您由于对PC应用叫嚣这种说法而被人满街追杀时千万别躲到的我地盘http://www.upulife.com中来,那时候我也罩不了你的。
为保证读性,文中故事内容进行了部分夸大。。。呵呵,哈哈。
文中使用的例子用的是delphi,而让我明白上面道理的工作与delphi没有任何关系。C是一门让你改变很多思想的语言。(不要跟我争论哪种语言好,各人所处环境和阶段不同罢了)
MD,打字打了我两三个小时,实在打累了后半段的论述实在不是很满意改天再说吧,呵呵,改天?改天我想说的就是:《系统参数使用方法》了,不过换了Gvim的确不会出现UE那种自动换行乱码的情况,一个字:好爽,欢迎拍砖:hjleochen@hotmail.com。
H.J.LeoChen 2005.10.20 fuzhou fujian.
顺便骂一下上海F1,Md什么东西出问题不好,跑道出问题了,真是丢人。
顺便骂一下东航,Md什么时候你能明白,我们要的不是多好的服务,多好的机上点心,要的只是你能准点,安全的把我送到目的地。分清主营业务是什么再搞你的乱开八糟的服务好不好?不是一次两次了,为什么每次坐你们航班都搞这种飞机?
顺便赞一下中国联通,没想到拿了一张钻石卡(A类大客户,哈哈想当年我也是做大客户系统的.),去机场竟然可以到头等仓休息室(我是穷人,以前没享受过.),让我爽得不行。。。呵呵。

安静的写着….

Friday, October 14th, 2005

一直以来我都不太在乎blog的访量,安静的写着,没想过出名(呵呵,就凭我不及格的语文水平可能吗?),也不想用这东西赚钱,只是安静的写着,想要记录下自己生活学习的点点。。
即使四年前办“晨风创意”的时候,也没怎么关注访量,只是默默的做着,看着少许的评论也是莫大的开心,甚至连统计都没装一个,不过后来当访量上去的时候我们却因为工作和学习开放弃了晨风。呵呵,那时还太年轻了十几岁的年纪我们还不会考虑很多,商业化?赚钱?或者如果当时坚持下去,即使PHP冷了,我们换个方向还是可能获得一些成果的。
但是这两天我却出奇的在乎,为什么?
因为我花了不少时间写的ruby on rails应用,收藏或者说网摘无人问津。对于自己的付出甚至连一个用户都没人注册心里确实很不是滋味,或者我是想错了,这本来就是一个试验性的东西,不需要寄托太多的。。。是嘛。呵呵。
或者wuxp说得对,就像我十几岁时看不到今天的样子一样,现在的我也看不到30岁时的社会是什么样子的,多听听近30的人的意见,多听听这位北邮研究生的意见才是对了。那么努力吧。。向下一个目标,这次的收藏(http://www.upulife.cn)只是另一个开始,一个我放弃四年的事物的接续,是的,只是开始但绝不是终点。
那么向下一个目标努力吧….
那么blog还是安静的写着….
前面的很多说要写的如ff插件编写之类的预告还是要兑现的。。。
以勉励自己.
2005.10.14 0:21

两年来我最满意的两个工作成果(监控和查重)

Tuesday, October 11th, 2005

想想时间过得真快,一转眼到这个团队两年了,两年间写了不少代码,做了不少工作,大部份时间用C,还有时候用delphi开发一下前台,还有用java做了个web前台,感觉做了很多事情哪。。。。
刚刚认真的想想,整理一下发现两年后的今天我觉得对我仍有意义并比较满意的工作成果竟然只有两个(当然有很多代码写得自己还是比较满意的,只不是在系统只没有广泛应用,就不算了)
一。刚来不久后写的一个监控程序,前台delphi,后台C,socket方式通信,xml配置及xml方式包传输,数据库无关。然后在后台的服务程序下面有很多小的shell或都C程序(当然可以任何语言了),来实现server的底层支持,来收集监控的具体信息。
工作方式是:前台程序启动,用户登陆(在服务器上注册),然后自动向服务器发送第一个请求,服务器根据请求的内容将配置信息及其它发送给客户端,客户端建立基本UI界面信息。 然后服务器根据XML配置文件的内容,定时或根据客户端的请求将监控的结果发送给客户端.客户端解析收到的XML数据包,并展现出来。(hehe,说得好乱)
其实代码写得不一定非常好,不过我觉得整个架构搭的不错,可扩展性非常高,XML消息包结算也定得非常简单和灵活,两年来基本没改过一行代码(指上述描述的几个模块,底下支持的小程序是不断增加的),而这个程序在不同主机和应用系统环境上运行得非常好,现在至少有四个省的7个以上的系统使用这套监控程序。
这个程序写了快两年了,因为当时的经验不是很丰富,还有一些不是很满意的地方,两年来也多次动过修改的念头,还曾经写了一个http服务器让整个系统支持cgi,以实现http式的展现。不过后来因为种种原因各种修改都没正式上线,还在我的机了上呆着,希望以后有机会发杨光大。
抓个图看看:
图有点大,点此查看
二.查重程序
查找重复杂话单,由于交换机或是系统人员操作的问题,常常会出现重复的话单,如果这个不处理就会多收用户的费用,所以查重程序在各种系统中应用很广泛,但是由于数据量大,查找慢,需要内存淘汰算法等,查重程序说起来还真是不那么容易写。我写这个程序大概是一年前吧,因为福建AAA常下重单所以被逼写的,后来整理了一下,现在也用在不少地方了。
这个程序是对系统输入数据进行关键字hash(md5算法)生成16字节关键字(无符号整型),加上4个字节的时间(timestamp)对于每个查重实体20个字节的记录大小,使用时启动程序,加载键值文件,生成平衡二叉树,然后加载要处理的文件,对文件的每一个实体取关键字生成md5 hash,然后进二叉树查找键值,如果找到表示重单。每个关键字hash有一个4字节的时间(timestamp)字段,可以设置淘汰时间。也可以按某种关键字将键值保存到不同键值文件以生成不同的树,减少查询时间。由于进行hash所以键值文件比较小,比如我的系统需要设置三个月时间段内对某种业务查重,以这种业务600万记录/月算 600万*20字节/1024/1024 约等于 115M大小的键值文件,三个月分三个文件345M,出现某个月数据时才将键值加到内存建树,由于平衡二叉树查找速度很快,所以直到现在为止没遇到性能问题,而且比起数据库查重快不是一点。
这个是后台程序就没抓图了。
下阶段的小目标:
一,实现一个灵活高效的系统模块间的交互系统。减小模块间流转的消耗。
二,实现常驻内存,服务式的查重系统,以进程间交互的方式来查重,提高效率及灵活性。
我发现共享内存方式的进程间通信实际上比较适合于对不常变更数据的环境下使用,比如说加载保存系统参数。而对于频繁的数据增加删除的环境用共享内存方式似乎不是很合适,或者我用得不好,请高手指点。
三,呵呵,这些就先不说了。。。。。:)
至于这些东西能不能实现就要看情况了。
个人的一些简单想法,请多指教。

FireFox如何支持DHTML非标准属性:innerText

Sunday, October 9th, 2005

innerText和innerHTML在IE中能正常工作,但是innerText在FireFox中却不行.
为什么呢?因为这两个属性都不是DHTML标准。
那为什么innerHTML在FF中可以呢?因为这个东西用得多了就成了事实的标准,而FF支持很多事实上的标准。
但是很可惜不支持innerText。
如何做呢?经过一翻较量,和查看FF的javascript console最终网上找到如下代码:

if(navigator.appName.indexOf("Explorer") > -1){
document.getElementById(’element’).innerText = "my text";
} else{
document.getElementById(’element’).textContent = "my text";
}

试验可行。。。
放心Myie之类的以IE为核心的浏览器扩展我也测试过了navigator.appName中也包含Internet Explorer。。。

国庆节

Monday, October 3rd, 2005

此时的兰州阳光明媚,昨日未蒸发的雨水加上阳光的照射使整个城市雾蒙蒙的,恍如笼罩着白纱的楼群和远山看上去是那么的美丽。
楼上街上来来往往的人们正在享受着节日和阳光的快乐,做生意的,逛街的、打牌的、散步的、、、、、一切看是去是多么的美好。
而这个国庆节我却觉得异常的寒冷,7-12度的低温并不算什么,但三四天来我总共的睡觉时间不超过14个小时,从9月30号晚上8点开始处理文件积压的四个小时开始,问题总是不断的发生
长途类别填错了、文件重名了、sp上传总部问题、话单错传了,接二边三的向我们扑来,基本上已经招架不住了,没有睡眠对我来说并没什么,但是对于不断出故障的巨大压力却让我无奈的喊出了:我已无力改变忧伤。
烟灰和烟头已经漫漫的堆漫了我的桌面,但不断的的叼着烟并不有为我减轻丝毫的忧虑,熬夜加上香烟让我嘴里有一种从未有过的苦位,挥之不去。
窗外的雾气已经渐渐消去,这个国庆也慢慢的离我们远去、发生的事情也会过去,但是有些东西我们不会忘记………
没有睡眠,但是我去更加清醒,每当夜深的时候我总是更容易专注的做点事情或都想些东西、前段时间中安的phonix兄说这就是成长的一个阶段,那个阶段是很痛苦的,他已经过去了,问我是否已经过去,我说正在经历吧
或者很多事情我们经历过才会真正的慢慢长大。脱变的过程总是痛苦的。
或者我应该换种活法,夜里工作而日间休息,而且最近我发现我的生物钟已经慢慢适应了这种状况……
其实总的来说计费这东西并不是很难,测试得好,参数配得正确,基本没什么问题,
想想现在每天下来做的那些事情就相当于最后把它 >>/dev/null
对于个人没有任何意义,或者正是离开的时候了…
我宁愿去哪种一个月1000块工资而做自己喜欢或有益的事情。
呵呵。

解决StatTraq的summary页面的中文显示问题

Saturday, October 1st, 2005

昨天说的Wordpress统计插件的显示中文问题,早上在summary页面中会乱码,而在page_views中不会乱码,于是打开源代码看了看,发现在wp-stattraq\reporter中的summary.php的140行,显示标题方法为

< ?php echo htmlentities(stripslashes($row->post_title));?>

而在page_views.php的126行输出标题却是支持打出:$post_title

应该就是 htmlentities,stripslashes两个函数的问题了,经过测试是由于htmlentities函数引起的。
知道原因解决就很简单了
解决方法一,我们就不用这个htmlentities功能了:
改summary.php的140行为

< ?php echo stripslashes($row->post_title);?>

就可以在summary中正确显示中文了。
那这是什么原因引起的呢?为什么stripslashes没问题,而htmlentities会有问题呢?让我们看看php文档:
http://cn.php.net/manual/zh/function.htmlentities.php

http://cn.php.net/manual/zh/function.htmlspecialchars.php
发现这么一段话:The default character set is ISO-8859-1,Support for this third argument was added in PHP 4.1.0.
原来默认编码是ISO-8859-1,这两函数支持设置编码,我们只要改一下编码应该就可以正常显示了,
所以解决方法二,保留htmlentities功能吧:

< ?php
echo htmlentities(stripslashes($row->post_title),ENT_NOQUOTES,”UTF-88243);
?>

注:上面第三个参数应该为:UTF-8,不知道为什么显示会有问题。
ENT_NOQUOTES:表示不转换”和’了
注:我Wordpress设置的默认编码为UTF-8
有一个疑问:
为什么stripslashes()处理没问题,而htmlentities呢?
stripslashes只是转换\\ ,\’为 \和’之类的功能,所处理的字符都为ascii,而utf-8兼容ascii。
htmlentities转换各种html标记为代码(怎么描述呢?),而html标记这些东西也应该为ascii吧??难道我想错了?
修改前:

修改后:

呵呵,可能这个系统的这两个功能不是同一个人写的,要不怎么在处理标题上有这么大不一致性呢。虽然这种事情在所难免(即使同一个人开发的),不过对于系统功能一致性的表现上还是需要多注意的。