Archive for 01月, 2010

drupal上传文件时“截断文件名开头中文”问题的解决

xtykc 01月 29th, 2010

很多人反映drupal上传文件时不支持中文文件名(文件名变成乱码)的问题,实际上在新版本中这个问题已经得到了解决,但是解决得不完美。

我遇到的问题是,文件名如果以中文开头,上传后,系统会自动截断文件名开头的中文部分。如《某某单位ABC系统测试报告.doc》这个文件上传后变成《ABC系统测试报告.doc》,如果是英文开头的即使包含中文也不会有问题,如《ABCDE学习指南.doc》这个文件上传后就是正常的,数字开头的也不会有问题。

很多人推荐使用统一字符编码的transliteration模块,我下载使用了下,发现它会把中文翻译成拼音,虽然不会出现文件名截断的问题,但并不是我想要的。看来只能从代码层面来解决问题了。

在drupal中掌管文件上传的代码在../includes/file.inc这个文件中,截断文件名的情况发生在语句:

$file->filename = file_munge_filename(trim(basename($_FILES['files']['name'][$source]), ‘.’), $extensions);

之后,是因为basename函数有时会截去某些UTF8字符的,原因是basename函数的结果取决于当时的locale设置:

The results of the basename() function are dependent on your locale setting.
If basename() is returning blank results for strings with multibyte characters, you can try including the following in your script:
<?php
setlocale
(LC_ALL, ‘en_US.UTF8′); # or any other locale that can handle multibyte characters.
?>

However, the best solution to do this would be to change the locale setting on your system or webserver. For example, on Debian systems, this is done in /etc/init.d/apache

对于CentOS的apache,确实存在这样的情况

The system locale in mod_php seems to be set to "C" instead of the locale of the system (which is "en_US.UTF8" in my case).

一种方法就是setlocale:

The workaround is to explicitely set the locale with "setlocale(LC_CTYPE, "en_US.UTF-8")".

另一种方法是修改httpd的启动脚本:

vi /etc/sysconfig/httpd
HTTPD_LANG=en_US.UTF8

理论上应该修改为en_US.UTF8,但是提交bug的人建议修改为en_US:

I tried it, but it didn't seem to work first. Now I got it to work. It works only with strings like "en_US" and not with "en_US.UTF8". The result is then the same as on CentOS 4 with PHP 4. However, on CentOS 4 the HTTPD_LANG variable is set to "C" as well.
我采用第一种方法,打开file.inc,在代码
$file->filename = file_munge_filename(trim(basename($_FILES['files']['name'][$source]), ‘.’), $extensions);
之前插入一行:
setlocale(LC_ALL, 'en_US.UTF8');
问题解决。
感谢涂虫小记的博文:WebFM模块的中文支持问题

谁是传奇?

xtykc 01月 21st, 2010

在日复一日平淡雷同无光无色的日子里,你,是否相信这世间还有传奇?

我相信,人世间或许有传奇,但谁能确定,幸福的青鸟就一定会飞向你?

也许你有一个传奇的开头,但未必有一个传奇的结局
也许有人一辈子过着按部就班的生活,有一段传奇却一直深埋心底
也许有人一直在追求着属于自己的传奇,不想本来就身在传奇之中,终其一生也不自知

你以为你终会忘记,却总是在不经意间想起
你以为今生可以就这样安稳和平适,它却时不时侵入你的梦里
你以为时间和空间可以将一切都阻止,谁能料平常里也会有惊奇

有人说:世界上最远的距离,是我就站在你面前,而你却不知道我爱你
而我说:世界上最远的距离,是我历尽千般,终于站在你面前,却发现永远也不能再说出当年不敢说的那一个字

——————————————————————————————————————————

上面是我给朋友的日志写的评论,有点想写一篇小说,但唯恐笔拙,把惊心动魄写成了平庸无奇,算了,先写个引子备忘

袁崇焕:金庸与当年明月

xtykc 01月 20th, 2010

小时候,看过一个电视剧,剧情已经忘得差不多了,但大结局却一直刻骨铭心。

电视剧的结尾,一位伟大的民族英雄被五花大绑在囚车上,须发凌乱,衣衫褴褛,遍体鳞伤。囚车过处,人山人海,群情激昂,人们脸上的表情是愤怒的,甚而有些疯狂,他们也喊着什么,但不是“***万岁”,而是“汉奸”、“卖国贼”,他们奉上的,不是痛惜的泪水,而是棍棒、拳头和牙齿。最后,英雄痛断肝肠(是真的断了,被愤怒的百姓咬断的,是真的用牙咬,在那个时代,汉奸是和巨奸秦桧比肩的大罪人),被凌迟处死… …

千古奇冤——这是我对一代名将袁崇焕最初的映像。

后来,看了金庸的《袁崇焕评传》,今年,又看了当年明月的《明朝那些事儿》,总算窥见了一点事件的来龙去脉。金庸的《袁崇焕评传》写的就是袁崇焕,在当年明月的第7本《明朝那些事儿-大结局》里,袁崇焕是主角之一。

有关袁崇焕的是非功过,历来在史学家那里,向来争议不断。金庸和当年明月,一个是成功的小说家,且不论金庸的武侠小说在文学界到底分量如何,但他是一个成功的小说家总归错不了;一个是通俗历史写手,畅销书作家,从某种意义上说,同样是成功的。

作为小说家的金庸,和作为历史写手的当年明月,他们写作的基础和依据,都是正史,都盛赞袁崇焕卓越的军事才能和勇猛无畏、爱憎分明、豪气干云,也都承认袁崇焕性格中的致命弱点,如冲动、执拗、我行我素等。不同的是,金庸是用一个小说家感性的眼光来看袁崇焕的,在金庸眼里,袁崇焕是猥琐萎靡的明末朝廷中一位大才豪气笼盖当世的大英雄,“他冲天的干劲,执拗的蛮劲,刚烈的狠劲”在那样暗淡无光的时代里是那么”明亮显赫、光彩辉煌“;而在当年明月大气冷静悲悯具有穿透力的眼光看来,袁崇焕尽管才华盖世,英雄无敌,虽然他执着于理想,也不过是党争的牺牲品,夹在皇帝的雄心和大臣的野心之间,既不善于权术的也无能力改变历史的可怜人。

对于袁崇焕之死,金庸认为是性格造成的悲剧,是袁崇焕的光明阳刚与明末王朝的猥琐萎靡之间的矛盾,以及与崇祯皇帝的急于求成和多疑善变之间的矛盾,是社会政治体制和个人抱负之间的矛盾;而当年明月则出人意料地推翻了皇太极反间计一说,甚至推翻了袁崇焕是民族英雄的说法,认为后世把袁崇焕美化成能够挽救明王朝的英雄是清代史学家耍的花招,目的是为了丑化崇祯和明王朝,他把真正的原因归结为明王朝皇帝和文官集团之间早已有之一以贯之的残酷较量和博弈,袁崇焕不幸地做了一颗被牺牲的棋子,内忧外患气数已尽,必然而然地破碎在覆巢之下。由此可见小说家和历史写手之间的天渊之别。

小说家金庸和历史写手当年明月各描写了一个场景,让我印象深刻。金庸选取了清军兵临城下之时,袁崇焕已被崇祯关到狱中,袁崇焕的心腹大将祖大寿一气之下把唯一能与清军抗衡的关宁铁骑带到关外,北京城危在旦夕,此时只有袁崇焕的亲笔信能让祖大寿返回救援,袁崇焕该怎么做,写还是不写?… …应该说,作为小说大家,金庸选的这个场景无疑最能体现悲剧性和戏剧性,此时,人物性格之间的矛盾冲突达到高潮,袁崇焕最后当然是写了,这是最能表现他大公无私的一个场景,也最能抓住人心。这里,金庸用了他最擅长的催泪绝笔:

在北京城的深宫里,十八岁的少年皇帝在拍着桌子发脾气。他又是焦急,又是害怕,不断的问太监:“袁蛮子写了信没有?怎么还不写好?这家伙跟我过不去,非将 他千刀万剐不可。你们再去催,叫他快写信给祖大寿!”他憔悴苍白的脸上泛起了潮红,眼中布满了红丝,不断的说:“杀了他!杀了他!”……
在阴森寒冷的御牢里,袁崇焕提笔在写信给祖大寿,砚台里会结冰吧?他的手会冻得僵硬吗?会因愤怒而颤抖吗?他的信里写的是些甚么句子?泪水一定滴上了信笺罢?
皇帝的信使快马驰出山海关外,将这封信交在祖大寿的手里。祖大寿读信之后,伏地大哭。讯息传了开去:“督师有信来!”辽河大平原上白茫茫的一片冰雪。数万名间关百战、满身累累枪伤箭疤的关东大汉,伏在地下向着北京号啕痛哭,因为他们的督师快要被皇帝杀死了。战马悲嘶,朔风呼啸,绵延数里的雪地里尽是伏着愤怒伤心的豪士,白雪不断的落在他们的铁盔上、铁甲上……

当年明月选取的场景则相对简单平实,写了袁崇焕被百姓痛骂唾弃,被侩子手凌迟处死之时,留下的一首诗:

一生事业总成空,半世功名在梦中。死后不愁无勇将,忠魂依旧守辽东。

然后写了一段惊世骇俗的评论:

或许到人生的最后一刻,他都不知道自己为什么会死,他永远也不会知道,在这个世界上,有着许多或明或暗的规则,必须适应,必须放弃原则,背离良知,和光同尘,否则,无论你有多么伟大的抱负,多么光辉的理想,都终将被湮灭。

袁崇焕是不知道和光同尘的,由始至终,他都是一个不上道的人。他有才能,有抱负,有个性,施展自己的才能,实现自己的抱负,彰显自己的个性,如此而已。

他应该很绝望,很失落,因为他不知道,什么时候他的冤屈才能被洗刷,他的抱负才能被了解,或许永远也没有那一天,他的全部努力,最终也许只是遗臭万年的骂名。

这是一个被误解、被冤枉、且即将被千刀万剐的人,在人生的最后时刻留下的诗句。

所以我知道了,在那一刻,他没有绝望,没有失落,没有委屈,在他的心中,只有两个字——坚持。一直以来,几乎所有的人都告诉我,袁崇焕的一生是一个悲剧。事实并非如此。因为在我看来,他这一生,至少做到了一件事,一件很多人无法做到的事——坚持。蛮荒之地的苦读书生,福建的县令,京城的小小主事,坚守孤城的宁远道,威震天下的蓟辽督师,逮捕入狱的将领,背负冤屈死去的囚犯。无论得意,失意,起或是落,始终坚持。或许不能改变什么,或许并不是扭转乾坤的关键人物,或许所作所为并无意义,但他依然坚定地,毫无退缩地坚持下来。

直到生命的最后一刻,他也没有放弃。

读金庸的《袁崇焕评传》,我激动、感动、心动,读当年明月的《明朝那些事儿》,我冷笑、苦笑、会心一笑,读到最后仿佛万事都可置之一笑!何谓英雄,何论成败?那些在历史上千古留名的人,那些挽狂澜于既倒,扶大厦之将倾的人,成就千秋功业,固然英雄了得,而那些散落在历史尘埃里的杯具和餐具,虽然不能改变什么,用金庸的话说:深处时代的大悲剧中,有的人只会“默默忍受”,而有的人却”勇敢地奋战了一场,” 用当年明月的话说:所谓千秋霸业,万古流芳,以及一切的一切,只是粪土。先变成粪,再变成土。”而有件东西,足以藐视王侯将相,超越一切,那就是:按照自己的方式,去度过人生。

英雄不过是一个符号,袁崇焕是否是英雄,并不重要,重要的是,”他勇敢地奋战了一场“,他无畏地执着地”按照自己的方式“,度过了他的一生,这已足够!

告别多事之年

xtykc 01月 1st, 2010

这一年,对我,注定是一个多事之年。

从数字图书馆研究到数字图书馆研发工程师,逐渐沦为半生不熟的程序员,毕竟写程序比做研究简单得多,我竟然渐渐心安理得,无奈;

参加了几次会议,也错过了几次会议,遗憾;

建了几个网站,wiki/drupal/gallery,多,而不精,快乐;

发表了一篇论文,惭愧;

博客逐渐荒芜,神伤;

经历了女儿的分离——重聚——渐行渐远… …惆怅;

见证了LG的辞职——创业——车祸——步履维艰——柳暗花明——前路茫茫——上下求索… …惊心;

在这一年还剩下几分钟的时候,回望自己的内心,惟余感激:

感谢生活,逐渐磨去我的棱角,让我逐渐变得圆润,通达,平和;

感谢朋友师长,给我一面面的镜子,我的浅薄和狂躁、自卑和自负皆无处遁形;

感谢父母,一直在我身后,不离不弃,召之即来,挥之即去,是我永远的守望天使;

感谢女儿,让我有机会再重头来过;

感谢肇事者,让我懂得珍惜自己的同时,也要加倍地珍惜他人;

感谢网络,让我与大千世界有了千丝万缕的联系,孤独者与孤独者相对千言,寂寞者与寂寞者脉脉遥望,我,不是一个人在战斗;

2009年,真的一去不复返了;

告别,不说再见… …