Jerome 的个人资料团团照片日志列表更多 工具 帮助
12月5日

百听不厌的《青花瓷》和一点感悟

    也不知是因为古典的伴奏还是因为山水画样的歌词,自从把周杰伦的新专辑《我很忙》从trix上挖进ipod后,这首《青花瓷》就再也没有戒掉。我想一定是这首歌的某些地方触动了我的情结。

    尽管我一直期望我自己能变的更加活跃一些,但其实我清楚地知道我自己恰恰是个喜欢恬淡的人,是个喜欢《青花瓷》意境的人。这倒让我想起了一个人,最近貌似还挺常上镜的一个人——杨子。这个传统家族企业中另类的继承人喜欢一个人静静地品青花瓷,从他张扬而又稳健的言语来看,他是典型的动中育静的个性,我很欣赏这种略带平衡感的个性,可能正是因为我的个性缺乏这种平衡感。

    “收放自如”,我想这是突破自我的下一站。

10月31日

回归后的唠叨

今天早上成功把ubuntu从7.04升级的7.10,还没来得及好好体验新功能,就发现了一个至少P2 bug,不过可能是env issue。晚上回去再慢慢折腾吧。

现在想起来,ubuntu也已经用了有1年半了,小有成绩:

  1. 蚕食了windows的一个7G的分区
  2. 平时的开发平台也过渡到了ubuntu中的eclipse
  3. 电脑娱乐除了DOTA基本上全是在ubuntu中进行的 (不过换个角度想,ubuntu也很好地“扼杀”了我游戏的欲望,因为在linux os下游戏实在没啥素材)

今天下午有个1个半小时的halloween下午茶,不过公司还是布置了一下,终归是美国来的,门口挂着一张脑海里很熟悉的鬼脸,想来想去好像是淘宝旺旺里的一个表情(说到淘宝旺旺,是个不错的面向国人的feature,毕竟讨价还价是老传统么,而且不用脸对着脸)。

先到这,现在是工作时间,work work

1月7日

缅怀

来抹抹灰。。。因为要和本命之年说88了。
多事的一年。。。
2月23日

随便说说①

      草都齐人高了,慢慢拔啊慢慢拔……
      今天研讨班不通知一声就不上了,2月14的Linux程序设计课也是,软院的某些老师还真是随便啊,要过节也和同学们打声招呼啊。想起我们可敬的孙老师,实在想冲着他们大骂四字经。不过算了,我不喜欢粗口,就用BS的好了,当然还要加个时间,无限BS!其实我更欣赏我们老hu同志的做法,程序设计三节课睡它前两节,期间不时地打呼呼发中断,第三节课还没开始就拍拍屁股让老师目送你出去。 Done!今年我的目标之一就是要化口头为手头,用行动说明一切。这个当然不是那么随便想出来的,其实最近已经强烈认为自己是个不成熟,说的比做的多的人,关键还说的不好听。叹,失败~jr这家伙咋就那么能说呢?说起这家伙,感觉他变化挺大的,务实多了,要闪光了,不知是因为工作还是因为一物降一物?
      昨天RP爆发,在3轮4门助教未中之后,终于给我撞到了一门,25岁的人了,终于能赚工资了,哈哈。不过本命之年终归还是有诡异的事情发生了,前天接了个电话,显示是yl同学的,一听不是他,我问对方啥事,对方说找***(不认识),我心里觉得不对,我说你这号谁的?他含糊地不知道在说什么,我又追问了几遍,他便挂了,当时yl正好在QQ,给他消息没回应,想是没啥大问题,不然肯定应了。不过刚刚一问,说是早就不用那个号码,该是被销号了后重用了。汗哪!这都可以……摸摸脖子上的红绳还在,还好还好,今年别太邪气就行……
12月3日

How to Avoid Foolish Opinions

研究生英语课本中大牛罗素(Russell)的一篇文章。文章讲述了避免自己愚昧思想的5条规则,颇有指导意义。我粗略的解读一下。
 
Rule 1: If the matter is one that can be settled by observation, make the observation yourself.
"如果问题能够依靠调查解决,自己要去调查。"亚里士多德(Aristotle)就曾不经调查的认为女性的牙齿比男性的小,其实他只要让他lp张开嘴给他看看就不会犯这种silly error了。自己乱猜或者道听途说的就认为自己对某个问题清楚地了解真的很foolish。想来我已经犯过不少这种错误了。
 
Rule 2: Whenever you find yourself getting angry about a difference of opinion, be on your guard; you will probably find, on examination, that your belief is going beyond what the evidence warrants.
"当你会为了一个不同的观点而发怒的时候,你要当心。事实证明,你最终很可能会发现自己所相信的观点已经超过了现有证据所支持的。"另外,如果相反,u feel pity,not anger,你的观点一般是有确凿证据的。绝大多数人,会对别人针对的自己潜意识中感觉没有确凿证据的观点的其他观点有很大的情绪波动。很多时候争论时的恼羞成怒其实自身原因就是冥冥之中也觉得自己的观点没有足够的证据甚至是有漏洞的,然后脸上挂不住了。
 
Rule 3: A good way of ridding yourself of certain kinds of dogmatism is to become aware of opinions held in social circles different from your own.
"一个能使自己免于某种教条主义的好方法,是关注社会圈中不同于你的观点。"新思想或者说未来的主流思想往往是和现存主流思想是有所区别,甚至是对立的。如果你能正视这些观点,很可能你会打破成规,不再受现存的某些世俗的愚昧思想所摆布。
 
Rule 4: For those who have enough psychological imagination, it is a good plan to imagine an argument with a person having a different bias.
"对于那些有足够心理方面想象能力的人而言,假想和一个持不同观点的人进行争辩是不错的打算。"
当然,能与人面对面进行真正的争辩显然更好。但这个规则也有它的优点,你完全可以不受时间、空间的限制。其实这和第3条实质上还真是差不多,我觉得key就是正视不同于自己的观点,不仅仅去包容,更要去理解。
 
Rule 5: Be very wary of opinions that flatter your self-esteem.
"要万分警惕那些过于使你自信想法。"过于自信,人就不理智了,就看不透自己的错误所在。所以对自己的想法也时常保持颗警惕心,要不会很惨。
 
最后,扯个不相干的。读文章时看见罗素就想到罗素悖论了,当时死也想不起来是什么了,后来只好靠google了,现在给其他忘了的朋友们一个很old的通俗描述,也好备不时之需^^:某理发师发誓“要给所有不自已理发的人理发,不给所有自己理发的人理发”,现在的问题是“谁为该理发师理发?”。首先,若理发师给自己理发,那他就是一个“自己理发的人”,依其誓言“他不给自己理发”;其次,若“他不给自己理发”,依其誓言,他就必须“给自己理发”。
 
 
11月8日

米帮回顾篇:米帮4-4-2

守门员:帮众曹睿,均衡性格,米帮最冷静的帮众,有着特有的气质,太极型守门员(出自少林足球)。

中后卫:帮主Gugu(我),内向性格,做事还算认真不过比较刻板,但作为戴着袖标的队长,还是在名义上发起了许多米帮活动。

中后卫:帮众lxh,内向性格,不喜欢主动出击但对帮派事业投资颇大,属于米帮中不可或缺的兢兢业业型人才。

边后卫:帮众loyo,均衡性格,由于队长帮主的失职,没有很好的调动过loyo在米帮的积极性。凭着以往所了解的娃娃的天才表现和前次拜访中所发现的娃娃nice的个性。娃娃势必可以成为米帮可攻可守的好手。

边后卫:帮众建森,均衡性格,平和的个性加上不凡的幽默能力,米帮春游之行从中获益颇多。

中场:帮副tingting、帮众莎莎,都有着相当出众的组织能力和协调能力,全队活动的真正发起者,场上的核心。tingting's 卓越的思考力、PP的外貌以及极强的亲和力,加上莎莎开朗的个性和极好的人缘是米帮成功发展的主要因素。

边前卫:帮众之光,均衡性格,北方人的爽气和北京人的贫,是米帮几次活动获巨大快乐的关键,队中最佳助攻王。

边前卫:帮众sherring(阿史),均衡性格。毕业旅行中,当tingting和莎莎觉得他中规中矩偏向于后防性格时,sherring成功的表现出了一个作为边前卫应有的活泼和不安分。

前锋:小樊和2face(竟成)同学,外向性格。小樊对目标的不懈追求及其表现出的高EQ使得她绝对可以称为米帮最具“杀伤力”的帮众。2face同学,也有着不错的亲和力,而且他绝对是属于对生活很有追求的一类人。假以时日,在职场闯荡一段时间后,他的“杀伤力”也不容小视。

米帮4-4-2:

2face      小樊

sherring      莎莎      tingting      之光

建森      lxh      Gugu      loyo

曹睿

最近变傻了

      反应慢拍、畏首畏尾、舍本逐末,OMG,what's wrong with me?对于tingting的request,我的response总是慢2秒出现的,我知道这并非可耻的中国移动的delay,其实是我反应神经受堵。应该是老毛病又犯了,又开始瞎敏感了,不敢讲话了。sigh~高三到研一,一点进步都没有。
11月5日

《Prison Break》

最早在高鳖处看见,相当推荐,有些类似《肖申克的救赎》的电视剧。
欲改变世界,先改变自己”,that's great.
10月29日

被点了...

兄弟托付,不做不厚道
 
游戏规则: 被点名在自己 blog 上写答案 并出一个题目,然后把题目丢给另外五个人, 并且到这些人的留言版上留下:“你被点名了。” 这五个人在自己的 blog 注明是从哪一个 blogger 那里传来的题目, 然后写下答案,并另写一个问题,再去贴另外五个人。比如你自己回答 14 个题目,你回答完了再加一个,被你点名的博友就要回答15个题目,如此继续下去…
 
提问1:一天早上起来,发现自己身边的人都变成蛤蟆似的只会跳,只会呱呱叫,你怎么办?『出题人:鬼丸』
回答:接着睡
 
提问2:怎么治疗失眠?『出题人:NURIA』
回答:算了,不知道
 
提问3:有点胖的女生和很瘦很瘦的女生,你相对喜欢哪种?『出题人:青佚』
回答:前者
 
提问4:如果你结婚的时候,对方不是你最爱的人,你这辈子还会幸福么?『出题人:scorpio』
回答:难说
 
提问5:如果我今天很忙,却还是抽出一段时间做某个人交给他的任务,那能不能说明我已经爱上她了?『出题人:花花的猪头』
回答:不会,千年难得还是会热心一下的。
 
提问6:请问你的3大怪癖是什么?『出题人:大头(锋芒)』
回答:....
 
提问7:认为世界上什么地方最适合养老?为什么?『出题人:晓静』
回答:张家港。一堆老朋友。
 
提问8:下辈子想要做什么?(偶问个俗套的问题不介意吧^_^)『出题人:Shirley』
回答:没想过。
 
提问9:最想去旅游的地方是哪里?『出题人:July』
回答:马尔代夫
 
问题10:现在你最想吃的3样东西?『出题人:英炸鸡』
回答:饱着,木有食欲
 
问题11:你做过最近的一个梦是什么?『出题人:菊花』
回答:不记得了
 
问题12:目前正在听那首喜欢的歌?『出题人:Tracy』
回答:smells like a teen spirit
 
问题13:至今为止你一生中改变你最大的一件事是什么?『出题人:Grace』
回答:恩,应该就那件事吧。
 
问题14:和一个比你成熟的多的人在一起,你会有压力么?『出题人:shanx2cn』
回答:木有。可以学习学习。
 
问题15:此生你最想得到或最想干的是什么,说得通俗一点就是:你活着为了什么或者说怎样的追求使你的人生更精彩?(by hm)
回答:这个问题一直没有答案。
 
问题16:你觉得残疾人最需要什么机器来帮助他们,也就是助残机械?(by luxi)
回答:能恢复回正常人的机器。
 
问题17: 你喜欢你的外婆多一点还是你的奶奶多一点还是没有差别。(by jenny)
回答:都非常喜欢。
 
 
问题18:只有一个电饭锅能做出什么好吃的?(by luhuiwen)
回答:太多了
 
问题19:最常上的网站是啥?
 
 
终于可以点名了
 
名单:晓红,木人,焘焘,莎莎,猩猩(给你们除草用)

As A Rock Beginnner

终于感觉到Popular和Rock的区别了。激荡心灵,无以复加。
10月18日

google desktop beta2

google桌面测试版2(htp://desktop.google.com/GoogleDesktopSetup.exe)来啦,安装文件1.56M,一贯google短小精干的风格。测试版2比原先多了很多的工具栏,都是比较实用的功能,比如执行项目可以记事,便签可以备忘,新闻自动更新,热门内容关注热点(英文),Web剪辑(RSS)链接你喜欢的RSS(比如MSN SPACE),系统监控避免老开任务管理器,可惜电子邮件似乎只针对Gmail。推荐给大家用用。下面是截图,只给出了其中一些工具栏。
10月10日

可耻的被宰了

9块钱的东西卖我39块钱,我居然不加思考的买下了。。。那位jj出手真是太狠了,乘2之后还要在乘2.x,搞得我现在极度不爽。以前还没有被宰的那么内疚加仇恨过。我决定了,明天要去那家店彪悍一下(难得的,佛祖保佑不要碰到黑社会)。
9月7日

“大五”的生活

我想我过的应该不是研究生的生活,实验室没有自己的位置,宿舍没有校园网,甚至连电也是会准点没有的。“大五”,这个说法更合理一些。
 
8月31日

谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词(zz)

这是一篇程序员写给程序员的趣味读物。所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级。整理这篇文章的动机是两个问题:

问题一:

使用Windows记事本的“另存为”,可以在GBK、Unicode、Unicode big endian和UTF-8这几种编码方式间相互转换。同样是txt文件,Windows是怎样识别编码方式的呢?

我很早前就发现Unicode、Unicode big endian和UTF-8编码的txt文件的开头会多出几个字节,分别是FF、FE(Unicode),FE、FF(Unicode big endian),EF、BB、BF(UTF-8)。但这些标记是基于什么标准呢?

问题二:
最近在网上看到一个ConvertUTF.c,实现了UTF-32、UTF-16和UTF-8这三种编码方式的相互转换。对于Unicode(UCS2)、GBK、UTF-8这些编码方式,我原来就了解。但这个程序让我有些糊涂,想不起来UTF-16和UCS2有什么关系。

查了查相关资料,总算将这些问题弄清楚了,顺带也了解了一些Unicode的细节。写成一篇文章,送给有过类似疑问的朋友。本文在写作时尽量做到通俗易懂,但要求读者知道什么是字节,什么是十六进制。

0、big endian和little endian

big endian和little endian是CPU处理多字节数的不同方式。例如“汉”字的Unicode编码是6C49。那么写到文件里时,究竟是将6C写在前面,还是将49写在前面?如果将6C写在前面,就是big endian。如果将49写在前面,就是little endian。

“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,一个皇帝送了命,另一个丢了王位。

我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。

1、字符编码、内码,顺带介绍汉字编码

字符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。早期的计算机使用7位的ASCII编码,为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5。

GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。

GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。

从ASCII、GB2312到GBK,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼,GB2312、GBK都属于双字节字符集 (DBCS)。

2000年的GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。从汉字字汇上说,GB18030在GB13000.1的20902个汉字的基础上增加了CJK扩展A的6582个汉字(Unicode码0x3400-0x4db5),一共收录了27484个汉字。

CJK就是中日韩的意思。Unicode为了节省码位,将中日韩三国语言中的文字统一编码。GB13000.1就是ISO/IEC 10646-1的中文版,相当于Unicode 1.1。

GB18030的编码采用单字节、双字节和4字节方案。其中单字节、双字节和GBK是完全兼容的。4字节编码的码位就是收录了CJK扩展A的6582个汉字。 例如:UCS的0x3400在GB18030中的编码应该是8139EF30,UCS的0x3401在GB18030中的编码应该是8139EF31。

微软提供了GB18030的升级包,但这个升级包只是提供了一套支持CJK扩展A的6582个汉字的新字体:新宋体-18030,并不改变内码。Windows 的内码仍然是GBK。

这里还有一些细节:

  • GB2312的原文还是区位码,从区位码到内码,需要在高字节和低字节上分别加上A0。

  • 对于任何字符编码,编码单元的顺序是由编码方案指定的,与endian无关。例如GBK的编码单元是字节,用两个字节表示一个汉字。 这两个字节的顺序是固定的,不受CPU字节序的影响。UTF-16的编码单元是word(双字节),word之间的顺序是编码方案指定的,word内部的字节排列才会受到endian的影响。后面还会介绍UTF-16。

  • GB2312的两个字节的最高位都是1。但符合这个条件的码位只有128*128=16384个。所以GBK和GB18030的低字节最高位都可能不是1。不过这不影响DBCS字符流的解析:在读取DBCS字符流时,只要遇到高位为1的字节,就可以将下两个字节作为一个双字节编码,而不用管低字节的高位是什么。

2、Unicode、UCS和UTF

前面提到从ASCII、GB2312、GBK到GB18030的编码方法是向下兼容的。而Unicode只与ASCII兼容(更准确地说,是与ISO-8859-1兼容),与GB码不兼容。例如“汉”字的Unicode编码是6C49,而GB码是BABA。

Unicode也是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方案。Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。UCS可以看作是"Unicode Character Set"的缩写。

根据维基百科全书(http://zh.wikipedia.org/wiki/)的记载:历史上存在两个试图独立设计Unicode的组织,即国际标准化组织(ISO)和一个软件制造商的协会(unicode.org)。ISO开发了ISO 10646项目,Unicode协会开发了Unicode项目。

在1991年前后,双方都认识到世界不需要两个不兼容的字符集。于是它们开始合并双方的工作成果,并为创立一个单一编码表而协同工作。从Unicode2.0开始,Unicode项目采用了与ISO 10646-1相同的字库和字码。

目前两个项目仍都存在,并独立地公布各自的标准。Unicode协会现在的最新版本是2005年的Unicode 4.1.0。ISO的最新标准是ISO 10646-3:2003。

UCS只是规定如何编码,并没有规定如何传输、保存这个编码。例如“汉”字的UCS编码是6C49,我可以用4个ascii数字来传输、保存这个编码;也可以用utf-8编码:3个连续的字节E6 B1 89来表示它。关键在于通信双方都要认可。UTF-8、UTF-7、UTF-16都是被广泛接受的方案。UTF-8的一个特别的好处是它与ISO-8859-1完全兼容。UTF是“UCS Transformation Format”的缩写。

IETF的RFC2781和RFC3629以RFC的一贯风格,清晰、明快又不失严谨地描述了UTF-16和UTF-8的编码方法。我总是记不得IETF是Internet Engineering Task Force的缩写。但IETF负责维护的RFC是Internet上一切规范的基础。

2.1、内码和code page

目前Windows的内核已经支持Unicode字符集,这样在内核上可以支持全世界所有的语言文字。但是由于现有的大量程序和文档都采用了某种特定语言的编码,例如GBK,Windows不可能不支持现有的编码,而全部改用Unicode。

Windows使用代码页(code page)来适应各个国家和地区。code page可以被理解为前面提到的内码。GBK对应的code page是CP936。

微软也为GB18030定义了code page:CP54936。但是由于GB18030有一部分4字节编码,而Windows的代码页只支持单字节和双字节编码,所以这个code page是无法真正使用的。

3、UCS-2、UCS-4、BMP

UCS有两种格式:UCS-2和UCS-4。顾名思义,UCS-2就是用两个字节编码,UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码。下面让我们做一些简单的数学游戏:

UCS-2有2^16=65536个码位,UCS-4有2^31=2147483648个码位。

UCS-4根据最高位为0的最高字节分成2^7=128个group。每个group再根据次高字节分为256个plane。每个plane根据第3个字节分为256行 (rows),每行包含256个cells。当然同一行的cells只是最后一个字节不同,其余都相同。

group 0的plane 0被称作Basic Multilingual Plane, 即BMP。或者说UCS-4中,高两个字节为0的码位被称作BMP。

将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。在UCS-2的两个字节前加上两个零字节,就得到了UCS-4的BMP。而目前的UCS-4规范中还没有任何字符被分配在BMP之外。

4、UTF编码

UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:

UCS-2编码(16进制) UTF-8 字节流(二进制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx

例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

读者可以用记事本测试一下我们的编码是否正确。需要注意,UltraEdit在打开utf-8编码的文本文件时会自动转换为UTF-16,可能产生混淆。你可以在设置中关掉这个选项。更好的工具是Hex Workshop。

UTF-16以16位为单元对UCS进行编码。对于小于0x10000的UCS码,UTF-16编码就等于UCS码对应的16位无符号整数。对于不小于0x10000的UCS码,定义了一个算法。不过由于实际使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以认为UTF-16和UCS-2基本相同。但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。

5、UTF的字节序和BOM

UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”?

Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一个有点小聪明的想法:

在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。

这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。

UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF(读者可以用我们前面介绍的编码方法验证一下)。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。

Windows就是使用BOM来标记文本文件的编码方式的。

6、进一步的参考资料

本文主要参考的资料是 "Short overview of ISO-IEC 10646 and Unicode" (http://www.nada.kth.se/i18n/ucs/unicode-iso10646-oview.html)。

我还找了两篇看上去不错的资料,不过因为我开始的疑问都找到了答案,所以就没有看:

  1. "Understanding Unicode A general introduction to the Unicode Standard" (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter04a)
  2. "Character set encoding basics Understanding character set encodings and legacy encodings" (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter03)

我写过UTF-8、UCS-2、GBK相互转换的软件包,包括使用Windows API和不使用Windows API的版本。以后有时间的话,我会整理一下放到我的个人主页上(http://fmddlmyy.home4u.china.com)。

我是想清楚所有问题后才开始写这篇文章的,原以为一会儿就能写好。没想到考虑措辞和查证细节花费了很长时间,竟然从下午1:30写到9:00。希望有读者能从中受益。

附录1 再说说区位码、GB2312、内码和代码页

有的朋友对文章中这句话还有疑问:
“GB2312的原文还是区位码,从区位码到内码,需要在高字节和低字节上分别加上A0。”

我再详细解释一下:

“GB2312的原文”是指国家1980年的一个标准《中华人民共和国国家标准 信息交换用汉字编码字符集 基本集 GB 2312-80》。这个标准用两个数来编码汉字和中文符号。第一个数称为“区”,第二个数称为“位”。所以也称为区位码。1-9区是中文符号,16-55区是一级汉字,56-87区是二级汉字。现在Windows也还有区位输入法,例如输入1601得到“啊”。(这个区位输入法可以自动识别16进制的GB2312和10进制的区位码,也就是说输入B0A1同样会得到“啊”。)

内码是指操作系统内部的字符编码。早期操作系统的内码是与语言相关的。现在的Windows在系统内部支持Unicode,然后用代码页适应各种语言,“内码”的概念就比较模糊了。微软一般将缺省代码页指定的编码说成是内码。

内码这个词汇,并没有什么官方的定义,代码页也只是微软这个公司的叫法。作为程序员,我们只要知道它们是什么东西,没有必要过多地考证这些名词。

所谓代码页(code page)就是针对一种语言文字的字符编码。例如GBK的code page是CP936,BIG5的code page是CP950,GB2312的code page是CP20936。

Windows中有缺省代码页的概念,即缺省用什么编码来解释字符。例如Windows的记事本打开了一个文本文件,里面的内容是字节流:BA、BA、D7、D6。Windows应该去怎么解释它呢?

是按照Unicode编码解释、还是按照GBK解释、还是按照BIG5解释,还是按照ISO8859-1去解释?如果按GBK去解释,就会得到“汉字”两个字。按照其它编码解释,可能找不到对应的字符,也可能找到错误的字符。所谓“错误”是指与文本作者的本意不符,这时就产生了乱码。

答案是Windows按照当前的缺省代码页去解释文本文件里的字节流。缺省代码页可以通过控制面板的区域选项设置。记事本的另存为中有一项ANSI,其实就是按照缺省代码页的编码方法保存。

Windows的内码是Unicode,它在技术上可以同时支持多个代码页。只要文件能说明自己使用什么编码,用户又安装了对应的代码页,Windows就能正确显示,例如在HTML文件中就可以指定charset。

有的HTML文件作者,特别是英文作者,认为世界上所有人都使用英文,在文件中不指定charset。如果他使用了0x80-0xff之间的字符,中文Windows又按照缺省的GBK去解释,就会出现乱码。这时只要在这个html文件中加上指定charset的语句,例如:
<meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1">
如果原作者使用的代码页和ISO8859-1兼容,就不会出现乱码了。

再说区位码,啊的区位码是1601,写成16进制是0x10,0x01。这和计算机广泛使用的ASCII编码冲突。为了兼容00-7f的ASCII编码,我们在区位码的高、低字节上分别加上A0。这样“啊”的编码就成为B0A1。我们将加过两个A0的编码也称为GB2312编码,虽然GB2312的原文根本没提到这一点。

8月23日

16种系鞋带的方式(转自mop,转的好累- -!)

第一种 第二种
第三种 第四种
第五种 第六种
暂缺!
第七种 第八种
第九种 第十种
第十一种 第十二种
第十三种 第十四种
第十五种 第十六种
8月22日

对这些天所学的一些理解

8月18日
对C#中的代表、事件的一些简单理解
C#中的代表有些类似C/C++中的函数指针,换句话说你使用代表的时候其实在使用代表所指向的一个或者多个类或对象方法(函数在类或对象中的体现)。事件的处理由代表所代理。而事件的引发机制不详中。简单举个例子:
public delegate void EventHandler(string str);//定义一个代表
class EventSource//定义事件源
{
public event EventHandler Say;//定义一个事件,由代表EventHandler代理
public void TriggerEvent();//触发事件
{
if(this.Say!=null) Say("A Event Take Place");//如果代表指向了一个以上的处理函数,则触发事件。
}
}
 class Test
{
public static void main()
{
EventSource eventsrc = new EventSource();//事件源实例化
eventsrc.Say+=new EventHandler(MyEvent);//事件的代理指向了MyEvent函数来处理事件
eventsrc.TriggerEvent;//触发事件
}
public static void MyEvent(String str);//事件处理函数
{
System.Console.WriteLine(str);
}
}
 
8月22日
从email的地址说说正则表达式的一些定义
email地址的正则表达式:"^[\w-]+@[\w-]+\.(com|net|org|edu|mil)$"
^是一个元字符,表示字符串的开始
$是一个元字符,表示字符串的结束
[]是一对元字符,表示里面的字符选一
\w是预定义的集合元字符,表示a-z,A-Z,0-9,_(下划线)里的任一个字符,若W大写则反之
-就是一个字符
+是一个非显式限定符亦元字符,表示前面的字符或者字符串出现1次以上
\.里的\是一个元字符,表示转义,此处“.”即“.”(点),而未转义时“.”是一个元字符,表示任一字符
()是一对元字符,表示分组,即在 ()内即一个整体
|是一个元字符,表示两边任选一个
现在,我们可以看出这个正则表达式的含义了,@前和@后.前均可以以字母+数字+_+-的任意组合表示但不能为空,.后只可以是com,net,org,edu,mil中的一个。这一表达式其实也不尽完美比如还有com后还有.cn的email地址,如此我们可以加个(.cn)?。
还有一些元字符,说几个重要的,*,?类似+分别表示0次以上和0或1次,{数字}表示出现数字次,如果加上“,”,如{数字,数字}则表示出现次数的上下限。
正则表达式是相当有用的。除了验证用途外,还可以模式匹配,有效重设文本格式等等。

MSN Space新花样

喜欢上面的播放器么,想要更多的功能么,可以去这里看看哦
8月15日

超强的广告语

路过一家动漫店,看见了超强的广告语:
会动的漫画
    中国第一家
8月10日

努力的第一步:第一次自觉看完了一本专业书

看来只要有了让我自己都认可的目标,我还是有毅力去实现的。给自己肯定了一下,再接再励。
不过一本书实在是意味不了什么,在CSDN上看见的许许多多问题,想必也是我将来要碰见的诸多问题,它们的解决主要靠的是基础知识上的实际经验。恩,第二个阶段性目标:大量编程,积累实际经验,同时,继续攻读一本书籍,有关Linux。因为考虑到现在Linux/Unix在服务器领域和嵌入式系统中的广泛用途,我想很有必要好好学一下。建森这个技术狂貌似最近也和我做着一样的打地基工作,嘿嘿,说好了要一起开公司的,的确该努力把。extravagant hope or not,wait and see what happens
8月9日

一个小女孩演唱的《一只小小鸟》,超可爱啊

kugoo上的,挺有趣的
有时候我觉得自己永远都吃不饱
也许只有吃的很多才能够长高
盼望能有一张迷人的相貌把所有人都迷倒
最后发现只有一种方法使用蒙汗药
长大之后无奈进入了社会我总是睡不着
我怀疑公司给别人的工资都比我高
总是努力学着对别人微笑难免也中他们圈套
偶尔上帝也会对我说失败很重要
我是一只只只~~~小鸟
因为吃的太多已经飞飞不高
我寻觅一颗栖息的树已被我压折了
这样的重量算不算太高
我是一只只只~~~小鸟
突然一天醒来有了迷人的美貌
麻雀也能飞上青天谁的歌声真美妙
美女的要求也不算太高