你应该记住的一个UTF-8字符「EF BF BD」

utf-8是一种变长(1 byte ~ 6 bytes)的unicode字符集编码方案。所谓编码方案即讲字符集到码点(code point)的映射方式。

在众多的utf-8码点值中,除了ascii,你还应该记住「EF BF BD」,因为它是很多编程语言以及库中的备胎,即无效的码点值在编码的时候会默认用这个码点值进行替换,即utf-8中的超级「备胎」(REPLACEMENT CHARACTER)。

为什么会有无效的码点值?

UTF-8 Code Point

从上图可以知道,utf-8编码 并非连续的 。很多人会忽略这个细节。

什么时候会遇到无效的utf-8码点?

当你试图把一个无效的码点值作为utf-8码点处理时,就会产生无效的码点。此时,无效的码点会被替换为「EF BF BD」,然后进行后续处理,以避免无效码点可能引起的异常。很多语言对这种处理是 自动进行 的,比如golang:

为什么要记住这个码点

在「字符集敏感」的环境中,如果你的数据中出现了「EF BF BD」就应该警惕了,因为你传输的数据中途很可能经过了自动替换,收到的数据未必是原始的数据。这对于你排查一些奇怪的数据交换不一致问题是很有用的,很多时候,可能是你的最后一颗救命稻草。

例如,使用utf-8编码的xml文档进行数据交换,如果看见了「�」,毫无疑问数据源有非法码点值。网页中出现了「�」,那么肯定是html文档的编码不是合规的utf-8编码文档。文本编辑器中出现了「�」,那一定是你打开这个文档的姿势不对——又选错编码了。总之,当你看见超级备胎「�」的时候,不要觉得大事不妙,不要像遇到一般乱码那样惊慌失措,你应该轻轻弹一下鼠标上的灰尘,将之打回原形。


因为aws的账单,才意识到自己的vps已经很久没有折腾了,博客也已经长草,应该说已经长成灌木丛了。

这才意识到自己已经回成都快9个月了。

有人说,时间是把杀猪刀。这很公平。但是,即使哪天挨上了这杀猪刀,也希望自己是头优雅的猪。

而此时,2015已经过去1/4.

我的2014年终总结

我尝试在2014最后的半个小时,记录一下这一年自己经历的事情。

3月,拿了一个自己以为当初想清楚了,但是拿到手却毫无喜悦的毕业证书。一直以为自己与众不同,其实,“我们终将成为当初我们讨厌的人”。以为手到擒来的优秀论文结果却莫名的没有……嗯,反正也是制造学术垃圾,就无所谓分个三六九等啦,如此想来,倒也释怀。作为毕业生代表,在毕业典礼上有一次「失败」的发言。当然啦,其实根本也没人听你说些什么,即使听了,你说些什么也不重要。你能指望在一个自己都没去过大海的毛孩子能告诉你大海的波澜壮阔么?

毕业那几天,妞妞来了学校。我知道,这本来是一个跟高考一样无聊的人生转折点,但是我那段时间真的是想她了。与羽毛球、昊妞一行,在帝都爆表的雾霾下,泛舟紫竹院——基友,挚爱,青春,无知——有时候人生的幸福就是那些你习以为常的事物正好在某一时刻凑在了一起。

毕业即失业。公司的发展越来越举步维艰。当初的幻想基本破灭,只不过大家碍于各自原因,都没有捅破。老罗说,没有人嘲笑的是不值得实现的。但是,现在的人们其实都太喜欢显示自己的涵养与逼格,即使你用肉包子取打狗,他也会委婉的告诉你,达尔文也不能解释这个问题。人生就是认真的体验,经历就不后悔。只是,如果我们能够做得多一点,体验也能更加丰富一点。

5月,带着简历走错了地方,赶上了天府软件园招聘。感谢360刘朝辉,跟他聊了半个小时,他给我了一张回成都的机票。感谢为我免费打印简历的现场工作人员,尤其是那位看着我的简历断定我一定能讨到职位的小哥。临走前,多出一份简历,丢给了我现在在职的N公司。6月初,回到了成都。

机械式的工作了两个月。更多的时间选择陪伴家人和妻子。没有任何工作上的成就。

7月,终于等来了小马三。一辆很纯粹的驾驶者之车,希望在这位智美伙伴的陪伴下,看能多的风景。

8月底,参加了北理工四川校友的迎新活动。顺便把一个小学妹推荐进了N公司。

9月,我和妞妞接受了亲朋好友的祝福,开始了我们不一样的幸福生活。婚礼后,带着远道而来的小伙伴们自驾走马观花了都江堰、乐山大佛、峨眉山。在峨眉山的那个夜晚,是自己回成都以来睡得最香的一个夜晚。

金秋十月,我跟妞妞每周到不同的地方吃喝玩乐+腐败。终于去了简阳海底捞总店——跟味道、服务无关,就是想起了帝都那会跟小伙伴笑的花枝乱颤的日子。

11月,日程表出了bug. 我和妞妞收到了意料之外的人生升级礼包。虽然是大喜之事,但是当时的确萎靡了半个月。自己的确没有准备好,但是什么时候能准备好呢?等你年薪过百万?等你游遍千山万水?人生呢,如果都是既定程序,真的好无聊。

成为了易到的司机,至今未开工。希望来年财源广进。

老爸那边,有了新的事情和项目,挺为老爸高兴的。老爸必然有自己的局限性,我关注的也跟金钱无关,就是喜欢老爸忙碌时候跑去天府广场对着雾霾拍一个若隐若现毛爷爷朋友圈的状态。

在N公司半年,自己无建树和贡献。感慨时光飞逝之时,也自责误人子弟。切忌,没有好目标也没有坏目标,最坏的是没有目标。回成都养老也半年有余,这次驻足早已timeout。

新的一年,无他,肩负好自己理所当然的责任。在追寻不凡的道路上不妨快一些,再快一些!

Bye 2014!

Hello 2015~

2015.1.1 00:13

golang中接收者初探

今天使用net/http库做了一个简单的server. 遇到一个之前自己忽略的问题,觉得挺有意思,简单做一个笔记。

server通过调用

实现。需要传递一个Handler类型的接口进行request/response的处理。Handler接口定义如下:

一切都非常简单,于是花了一分钟,写了一个server:

看似一切都没有问题的样子……但是却编译错误:

原来是类型不匹配的问题。具体来说,接收者的类型才是真正实现接口的类型。在本例中,接收者类型是*Myserver,myServer也必须是一个指针。fix后的代码如下: