尝试了一下 iOS 九宫格拼音输入法

iOS 下的中文输入一直是我的一块心病。苹果也许特别在意安全,总是对第三方输入法大加限制,而输入法这一块又确实是十分敏感的环节,开发商有一点坏心思,你输入的敏感信息就全都泄漏了。

也许放在过去我是没有问题的吧,但自从今年心血来潮,学会了双拼输入法,原生的输入法就无法满足我的需求了。其实在过去我就对原生的九宫格拼音输入很有意见了,它的功能有些弱,尤其是输入词组时,只能选定第一个字的发音,而不能像第三方输入法一样选定其余字的发音,准确率大大降低,备选词有很多,需要耗费挺长的时间才能找到需要的词。我的妻子的 iPhone 上一直用着九宫格拼音输入,我实在是不能想像她怎么忍受的。

所以过去我一直在用百度输入法,它的九宫格设计是我用着最舒服的。首先界面(我比较喜欢朴素的风格,实在是不能理解那些用花俏的皮肤的人的想法),每个按键用圆角矩形做出修饰,而苹果这个圆角矩形的创始人却没有用这样的设计,那九宫格输入法的按键横平竖直的,不知道是不是在向中国传统的井田制致敬,看上去那叫一个粗糙。另外一个超级有用的按键是清空键,输入的时候手会很快,不时会有按错键的情况,一个一个字母的删除修正,不如直接全部取消重新输入一遍来的快,苹果的键盘没有这个键,效率大大降低。我也尝试过搜狗之类的键盘,但设计实在不入我的眼,比如键盘上单独一个 0 键,只为了一个数字零,单独占用一个键位,既浪费又不美观,真是无法忍受。

百度输入法再怎么好用,但架不住百度这家公司的节操。这种信息泄漏实在是可怕,虽说我尝试讯飞输入法也有信息泄漏的风险,但百度的信誉,和他们根本不是一个数量级。

我也尝试过讯飞输入法,之前用安卓的时候张昊给我推荐过,我试过挺不错的,语音识别很准确,手写输入也很方便。让我崩溃的是,在 iOS 平台上居然不能直接语音输入,需要到一个应用里完成识别,再复制到所需的地方,这种方式也让人不能忍。还有一个选择是 SwiftKey,我在用安卓的时候拿它打英文,自动纠错功能很强大,后来我买了三星 Galaxy Note 7,在上面试了一下,居然已经支持中文输入了,真是感人,可惜我那时候需要双拼输入,就弃了它。我在用 iPhone 的时候,心想哪怕没有双拼,用 SwiftKey 打字应该也不错吧,结果 iOS 版本居然不支持中文,看来 iOS 对第三方输入法的限制太狠,让他们开发兴趣不大了。

最近我重新尝试了一下专注于双拼的落合输入法,这个输入法可以用高冷来形容了,诉求之一是绝对安全,不需要让输入法获取权限,但也限制了输入法的功能,比如按键音。输入法的设置界面上有比较翔实的教程介绍,让我增长了不少的知识,这点也很不错,但我觉得最大的问题是基本没有智能纠错,触控屏上的虚拟键盘按键本来就容易按的不是那么准确,过去用过的输入法大多能根据拼音识别出来你真正需要按的是哪个键,而落合输入法没有这项功能,这在双拼方面问题更加明显,往往你不仔细看,都不能发现你是怎么错的。另一个问题有些争议,作者明确的说落合输入法不会调整词频,好处是你要打的字,永远在那个位置不会变,但我认为缺点更明显,这又不是物理键盘,位置不动的优势非常有限,反而因为不能把你常用的字、词放在前面而影响了输入效率,这让我很不习惯。

用了一圈实在没有办法,我又用会了 iOS 原生的拼音输入法。之前我是用全键盘的,因为它带有智能纠错,可以双手快速打字不用担心按到旁边的键,缺点是单手输入效率不高。前几天的一个晚上,我突发奇想尝试一下自带的九宫格输入,用它来打了一篇日记,测试下来觉得并没有我想像的那么糟糕,遇到找不到候选词的时候很少。而且我又发现了一项之前不知道的功能,用 3D Touch 可以移动光标,之前我在 iPad 上的键盘可以用两指手指按下来移动光标,我在 iPhone 上盼望这个功能已经很久了,没想到已经用这种方式实现了。因为在 iPhone 上主要是手持设备打字,一指操作是必须,但 3D Touch 的力度让这个功能有些不是那么自然。

总的用下来,我改变了之前对 iOS 原生九宫格键盘的想法,它没有我想像中那么难用,在单手输入的时候,虽然还不如第三方输入法那么迅速,但系统原生优势巨大,不用担心叫不出键盘的情况。3D Touch 功能也很方便,补充了功能上的不足。但比起我在安卓上使用过的谷歌拼音输入法,还是有很大的差距,至少双拼功能,如果能有这个就更加完美了。

型码输入迷思

今天趁着有时间,解决一下 Linux 下的中州韵输入法的双拼输入的问题。在我自己的 Linux 电脑上,我安装了 fcitx-rime。在我的想象中,中州韵应该支持双拼的,不过没有找到相关的选项,因此怀疑还要有特殊的设置。说道中州韵,我之前在 Mac 上使用过鼠须管,当时不知道为什么,这个输入法一下子就火了起来。我装上了后,也没有觉得跟搜狗、FIT、IMKQIM 等有什么不同,草草的扫了一眼配置说明,出了看到了扑面而来的台湾味道,也没感到有收获,后来还是用了搜狗。

其实有 fcitx-sunpinyin、fcitx-googlepinyin 等输入法支持双拼,不过我是看到了别人说用中州韵的小鹤双拼,还是想在中州韵上使用。今天从网上搜索了一下,看到百度贴吧上有人分享小狼毫上的鹤音+鹤型,下载下来后找到了相应的配置,复制到了自己机器上的 ~/.config/fcitx/rime/ 目录下,然后研究下其它的配置,发现了 /usr/share/rime-data/ 目录,原来官方的配置都在这儿呀,小鹤双拼也有。我修改了 default.yaml 里的配置,加上了双拼的配置,重启 fcitx 后不行。于是我于是静下心来,仔细的阅读配置文档。有一篇方案设计,读了后让我一下子了解了中州韵的配置性,原来作者把基础功能做成了模块,通过 YAML 文件来组合就得到了不同的输入法。文章中从简单到复杂的演示了用这些模块来实现各种功能的输入法,给了我很大的启发,也知道了如何启用小鹤双拼输入法了。

我选择了几个我想常用的,包括小鹤双拼、小鹤音型、明月拼音、五笔 86 这几个。这样终于把中文输入配置好了。

之前我一直用全拼,前几个星期因为无聊,看到网上有人说双拼的优点,我又有学习一种全拼以外的输入法的想法,看介绍说双拼不难,于是起了学习双拼的念头。经过了第一个半天的背诵韵母键位,加上忍着不适,强迫自己在办公中用双拼,确实经过略微痛苦又坚持的一周,就渐渐的入门了。虽然我现在的输入速度还达不到用全拼,不过很有趣。在上班的时候,我用的搜狗输入法,打开双拼,为了防止影响工作,我还打开了全拼的选项,其实手边放着键盘键位图,很少会发现打不出的字。

我从小鹤双拼的官方网站上看到了“小鹤双拼飞扬版”,于是下载下来,安装到了我工作的电脑上,结果反而不会输入了——有超多的字都打不出来。同音字只有一个选则,其余的都哪去了?我只好看教程,才知道飞扬版使用鹤型,加上了鹤型的型码,可以达到无错误的盲打。我看这个不错,又开始学习。我对鹤型比较有兴趣,因为小学时的微机教材上介绍了一个音型码输入法——认知码,我那时虽然没有微机,但硬看教材,算是理论上学会了这个输入法,觉得比五笔字型来说简单了太多。后来有了计算机后,认知码就消失了,可以说是一个商业上极不成功的输入法。现在的鹤型,跟认知码很类似,再加上无重码,让我有了兴趣学。

之后我终于能用小鹤双拼飞扬版打出一些字了。不过还是字根的问题,有些字根的规律我还没有熟练,导致有些字我还是打不出来,比如“小鹤”。这些只要熟练了就自然能好。不过,我发现不能整句输入让我很不习惯。过去用搜狗,整句输入非常流畅,脑子里也不用考虑太多,自然而然的跟着手指的本能打字就行。而小鹤飞扬版,能打出的词组都有限,一个字一个字的蹦,让我觉得思路被打断了一样。

我就考虑,型码因为没有重码的困扰,对整句输入没有要求,因此很少支持整句输入,这在今天不知是好事还是坏事。而我倒不是不能让自己通过练习来习惯,只是不明白为什么这么多年来,型码的用户们就没有整句输入的要求吗?

不过,傍晚的时候,我看到一篇文章,讲了如何在 Mac 上安装鼠须管加小鹤双拼·语句流。我看演示不错,等有时间仔细研究一下。

胡适对于中国图书的看法

最後 ,我們要讀書 ,必須要懂得一種外國文 。中國所有汗牛充棟的書 ,很少是有系統有結構的 ,是漫無計畫隨便集成功的 。好像 “論語 ”一書 ,東一句 “子曰 ,學而時習之 ,不亦樂乎 , ”西一句 “子曰 … … ”又一句 “子曰 … … ”其他如 “孟子 ” … …等書是零零散散集成的 ,毫無系統可言 。

有道理。

文言文与繁体字的复杂度

这是我前几天过春节吃水饺时脑子里偶然蹦出来的一个想法了,现在我都忘了当时是怎么就想到这里了。

我们在中学时语文课上会有几篇文言文,我们时常会觉得头疼。不光是文字上理解起来困难,课文通常也要求我们大段背诵。我们会问,为什么古人要这么别扭的写文章?答案出乎我们意料,根本原因不是因为古人觉得这样的文字文雅,而是因为古代人们在竹简上刻字非常麻烦,于是就尽量的简化语言,所以古代的文字就成了这样子了。当然,在白话文刚兴起的时候,多数所谓文人认为白话文“俗不可耐”,但那时是人们已经习惯了书面文字是文言文这个事实了。

新中国成立后,政府做了一件到现在也是褒贬不一没有定论的事情,就是简化汉字,所以有了大陆今天使用的简体字。当时的观点是为了普及文字,繁体字难学,因此简化之。当然,这个过程也不是一下子就成功了的。当时中央出台过几个方案,有的方案过于简化了汉字,到了日常使用会出歧义的程度了,比如“付经理”,在方案中,“付”等同于“副”,所以在日常中究竟“付”是不是被当做姓氏来用,就会产生歧义。不过方案中的有些文字在民间非正式场合也使用过一阵子,被我们的父母辈所使用,比如“鸡旦”等。还有一个说法是政府的终极简化目标是汉字的拉丁化,汉语拼音方案算是这个目标的一个副产物。当然这个方案被很多人所抵制,结果不了了之。

今天想起来,我不禁被当时政府的这种“破旧立新”的魄力所震撼,这种文化方面的事情,是随便就可以动的吗?也许是当初那帮人革命的惯性还没有停下来,什么东西都想革命。好在最后刹住了车,不然的话中华文明的千年传承不知道在今天会成为什么样子。说起来,我还是希望可以恢复繁体字的。因为不论是我个人的经验,还是港澳台三地的同胞作为活生生的例子,都告诉我们,用繁体字来普及教育是可行的。用繁体字的地区,人们并不会因为汉字太难学而放弃学识字。反而,大脑越用越灵活,繁体字写多了也许会有锻炼大脑的作用?

从语言用的白话文到书写用的文言文,文字的复杂度减小了;从繁体字到简体字,文字的复杂度同样在减小。我想的是,如果古人就用了简体字,他们会不会再写文言文?

繁体字跟文言文相比,我支持繁体字而排斥文言文。支持繁体字的理由之前说过,而排斥文言文则是因为文言文会舍弃一些信息。这里面一个很广泛的例子是儒家典籍的解读。因为文言文表述的信息时常有多种含义,不精确,古人写文章又不用句读,则同样的文字排列有时会有多种解读方法,这就产生了派别。比如,“民可使由之,不可使知之”就有两种意思立意完全不同的解读,这句话是“经典”还是“糟粕”就完全不同了。当廉价纸普及了之后,中国文人完全可以摒弃文言文而使用啰嗦一点的白话文,可惜没有被人们接受。当中遗失了一些信息,甚为可惜啊。

OS X 10.6 的 AppleScript 中文 bug

前几天一个偶然的机会我发现了 Shawn Blanc 的 blog。这个 blog 包含了一些时尚科技的评论,更新速度比较高。作者 Shawn Blanc 目前是专职维护这个 blog,blog 本身有收费会员订阅的项目,每月花 3 美元就可以阅读一些更多的内容。但免费的内容已经非常丰富了,作者有这个底气征收付款,在中文 blog 圈子中应该是比较难以想象的吧。

我从这个 blog 中看到一篇 MarsEdit 的评论,因为我自己也在用 MarsEdit,它是我的计算机上的几个花钱购买的商业软件之一,于是我就花了点之间仔细看了一下作者的评论,从中知道了我之前一直以为不存在的字数统计功能,竟然在脚本菜单下面。我知道自己还不是一个比较资深的 Mac 用户,比如像 mac script menu 这样的菜单我从来没有点过。这次知道在 MarsEdit 这个菜单下面,就有对文章的统计功能。于是我点了统计功能后,MarsEdit 的 CPU 占用率马上飙倒了 99%。最后只能把这个进程给杀掉。杀死进程后 MarsEdit 有崩溃报告功能,我就顺便把这个 bug 给报告了。

Apple 本身也有这种功能,不过可能用户量太大,Apple 应该只把它当作一个记录统计的作用。而 MarsEdit 的开发公司 Red Sweater 这种规模不大的公司,收到这种报告的次数可能不多吧,反正我第二天就收到了 Red Sweater 的回信,请我帮助他们 debug。我把造成问题的那篇文章发送了过去,因为我的文章是中文的,我以为 MarsEdit 可能对多语言支持的不够完善,就提了一句是不是 Unicode 方面的问题。

之后对方发来邮件,包含了一个另一个版本的字数统计脚本的附件,让我用这个脚本来试试。我试了一下,仍然有问题。脚本是用 AppleScript 写的,我从来没有学过这门语言,但据说它非常简单,脚本本身也不长,我看了几眼就大体上知道是怎么回事了。稍微研究一下,我想找出来是我的文章的哪个部分让这个程序的哪一行卡住了。于是排除了一下,发现造成问题的原因比较古怪,也不是所有中文都通不过,我发现的一种情况是只有字符串中包含一个汉字,跟上一个空格,再加上一个数字的时候,words of inputString 就会卡住。inputString 就是输入的字符串,脚本中用了 number of words of inputString 来获得字符串中包含的字符或汉字。我的那篇文章中正好有这种情况。实际上,我从几年前写文章就习惯再汉字跟数字及英文字母之间加上空格,这样更清晰一些,所以我的 blog 中一定会出现很多这种情况,我的大部分的文章都没办法用这种办法来统计字数。

我把我的发现发给了 Red Sweater,对方回信告诉我说这个问题在 OS X Lion 中不存在,因此似乎是 Mac 系统本身的问题。出问题的代码仅仅是调用了系统给的函数,因此也不好解决。对方说他们会想别的办法来获得字数统计功能。

另外,我还询问了对方能不能加上一个实时的字数统计功能,在编辑窗口中显示。结果对方告诉我目前 MarsEdit 已经有这个功能了,在状态栏里有显示。只是默认情况下状态栏是隐藏的,但对方担心他们做的统计功能可能不适合中文,因此他们也询问了我对于中文字数统计的要求。我看了对方的说法,他们或许是因为英文统计的是单词而不是字母的关系,所以考虑做中文分词,统计文章中出现的中文词组。我一看这可差老鼻子远了,中文分词本身就发展的不怎么样,还让老外来做这个,猴年马月才能弄出来啊,更何况中国人看字数统计也不管里面用了多少词组啊。所以我赶紧发邮件说别搞这个了,我们关心的仅仅是字数。

之后,不知道什么时候可以解决这个 bug。老外对于中国语言,大概从文化上就和西方语言有差异吧,我用过一些编辑器,里面也有字数统计的功能,但对中文来说都是没法用,因为它们全部是针对英文的单词设计的,字符之前没有空格就认为是一个单词,比如说这篇文章写到这里,MarsEdit 告诉我一共有 173 个 words,这就差的相当远了。不知道是不是所有写软件的老外都有类似的误会,考虑做什么分词,要能统一的给他们纠正过来就好了。

语言的代沟

写 blog 确实是需要惯性的,如果能一直坚持住就可以一直写下去,但一旦有一阵子停下来了,之后就开始懒惰了。我现在其实并不是忙到了没有时间写字了,只是就算是心里有了一些话题也只是在心中想一想而已,真要把这些想法记录下来也让我觉得太麻烦了。关于“语言的代沟”这个话题我很久之前就有了想法了,但一直没有动笔,今天难得有了兴致,于是就试着总结一下。

1

这个想法的起因是因为我的朋友张昊在 Twitter 以及一些其它场合里说他很反感有人用“杯具”、“我了个去”之类的网络流行词语,认为这是对于中文的亵渎。我对这种情况倒是不在意,可能是平时接触的也少的原因吧,我还没有对于这种新兴语言在网络上渐渐流行有一种清晰的认知。平时看到有人用这种词语,多数情况下略微思考也就可以翻译成我常用的语言,实在让我无法理解的就跳过,其实不影响我对于信息的吸收。因此对于张昊的看法我没有什么想法,也没有回应。

后来有一次我和我室友出去,在车上他因为了某件事发出了感叹,说了一句“我了个去”,我在旁边听着立马感觉一阵要起鸡皮疙瘩的感觉。然后我自己静静的回味他说这句话的场景,怎么想怎么觉得别扭,就好比在大街上看到一个壮汉穿着女仆装卖萌一样。我在想这是为什么,为什么我眼睛可以接受的语言用耳朵来接受就这么难受?我得到的结论是语言是否得体这方面。所谓语言得体,说白了就是指“什么样的人说什么样的话”。例如年轻人可以说一句“真爽”,但中年妇女说这个词你就觉得不对劲。我觉得我室友用“我了个去”这句话也是同样的道理,他年纪比我大,印象里他是 1985 年出生的,今年 26 岁了已经难以说是年少了,再用少年人用的词语给人的感觉就像是内力不够强练七伤拳一样。

我觉得这就是语言的代沟

包括火星文在内,如今的这些新兴网络流行词给我的印象是属于 90 后之人的嘴巴。网络充满文字缺少声音,因此容易让人忽视年龄,所以我看到字面上的这些词语后没什么感觉,但从同龄人的嘴里流到我的耳朵里,就让我感到不适,因为这些语言不属于我这一代。

2

我想起了我对于另一件事的感觉。几年前我的课业不紧的时候,我经常在 YouTube 上看一些比如《康熙来了》之类的台湾综艺节目。在里面我能够很明显的感到那些人与大陆上的同龄人的不同。比方说蔡康永,他是 1962 年出生的,比我父亲小一岁,可以算上是我父亲的同龄人了。但看他平时说话就和我父亲有相当大的不同。我觉得我可以根蔡康永像朋友一样谈话,但跟我父亲像朋友一样谈话则无法想象。

除了父子之间本身的辈分差异之外,我觉得两者从语言上就给人有着微妙的不同感觉。从我父亲的语言上我可以很清晰的意识到我跟我父亲处于不同的一代,但蔡康永的语言给我的感觉明显要跟我近的多。

我有一阵子比较喜欢观察台湾社会,发现在很多地方台湾都比大陆年轻,也就是说台湾的人似乎比大陆的人晚出生了一代。我怀疑大陆的 20 岁以上的青年跟台湾 30、40 岁的人差不多属于一代,两者之间语言、意识形态等方面都比较类似。相对来说,台湾社会总体上比大陆要年轻,更有活力,我想这跟体制有一定的关系。回到语言方面,从大陆跟台湾的语言风格比较,我感觉我目前台湾的中年人一代比较相似于大陆青年一代,依此类推,台湾青年人则对应大陆的 90 后,台湾的 90 后则对应大陆 80 后人的子女一代。这么说来,我比较听不惯的新鲜流行词也许在台湾我的同龄人里面就比较有市场。

以上多是我的臆测。

3

我上一代的人们经常听不惯今天台湾人说话,说这些是“做作的港台腔”,而我们却可以甘之若素。我听不惯下一代人的语言,也许这就是代沟——我们可以接受古典,但对于新潮,或许每一代人都有这种抗拒的本能。

成语列表

今天浏览TopLanguage的时候,看到有人提到成语接龙,于是想自己也试试。找到一个成语列表似乎是基本的一步,但从Google上找了一会,居然没有。看到问典上有个还比较全的成语列表,可惜是按照音调排在了不同的网页里,于是自己写了几个Perl脚本,把成语提取了出来。这几个脚本是相当quick & dirty的工作,不求功能完整,也没有整合起来,手工分成几步完成了全部工作。

  1. 获取这个页面的源代码,保存成本地文件,作为参数执行下面的代码。这个页面的HTML不知道是什么软件生成的,没有换行,全部都在一行上,于是就把其中的一个tag替换成了换行符。

    #!/usr/bin/env perl
    
    $_ = <>;
    
    s/<\/a>/\n/g;
    
    print;
    
  2. 把上个程序的输出导出到一个文件中,作为参数执行下面的代码。这一步就纯是提取每个音符开头的成语列表页面的链接,并加上链接头。当中有些链接是‘#top’,弄个if语句过滤掉。程序的输出就是一行行的链接了。

    #!/usr/bin/env perl
    
    while (<>) {
        if (/href='(.*)'/) {
            if ($1 eq '#top') {
    
            } else {
                print "http://www.wendian.com.cn/idiom/$1\n";
            }
        }
    }
    
  3. 把上个程序的输出导出到一个文件中,作为参数执行下面的代码,就会得到每行一个的成语列表了。这一步首先通过LWP包获得一个链接的HTML代码,然后转码,最后把包含成语列表的那一行找出来,提取初单个成语输出。运行时程序会在stderr提示宽字符之类的警告,可以忽略,用重定向符输出到文件时不影响。

    #!/usr/bin/env perl
    
    use utf8;
    use Encode;
    use LWP::Simple;
    
    while (<>) {
        $page = decode("gb2312", get($_));
        @lines = split(/\n/, $page);
    
        foreach $line (@lines) {
            if ($line =~ /首字拼音为/) {
                @words = split(/&lt;li style='font-size:15px;'>/, $line);
                foreach $word (@words) {
                    if ($word =~ /&lt;a href='.*'>(.*)<\/a>/) {
                        print "$1\n";
                    }
                }
            }
        }
    }
    

另外,为了方便,我把我的结果一并放上(文本文件用UTF-8编码)。(HTML格式|bzip压缩格式