OS X禁用NSTextView的引号替换

来源:互联网 发布:湖州华为云计算产业园 编辑:程序博客网 时间:2024/06/03 21:01

4th,August,2016

问题描述

在NSTextView中输入json的双引号时,输入法为英文,但显示的是中文的引号。而且在输入过程中能感觉到英文引号替换成中文引号。顺便试了下NSTextField,不存在该问题。再试了下单引号也存在该问题,而!,@,#等字符不存在该问题。
猜测:是系统对引号做了特殊处理,在输入引号的时候将输入法更改为中文输入法吗?
于是按着这个思路去查看了NSTextView.h头文件,查找跟输入法相关的API,并没有找到。(r:这里都不懂如何输入关键字,typewriting?纠结啊)。
尝试1:实在是不知从何入手,查看了下NSTextView中的API,尝试了下重写-insertText,识别到输入中文引号,就重写成insertText:@”\”“,但是其实在输入英文引号的时候,insertText识别的也是英文的引号。所以这种思路其实是不可行的,是在显示时(insertText后)则切换成中文引号了。
尝试2: 在storyboard中,NSTextView属性smart Quotes,智能引号默认是开启的,尝试了下禁用。但仍然没有解决!难道是系统bug?
这里写图片描述
好吧,揭晓谜底的时候到了…

直引号与弯引号

弯引号:「typographic, or curly quotation marks」
直引号:「neutral, vertical, straight, typewriter, or dumb quotation marks」,又叫dumb quotes傻瓜引号

直引号本是打字机时代为了尽量节约键盘空间而制作出来的。–from 《西文字体》

现代的键盘和 ASCII 字符集都继承了这个传统——ASCII 中只有一个单直引号(U+0027 ’ apostrophe)和一个双直引号(U+0022 ” quotation mark)。
主要是因为一些文字处理软件(如 Word),能自动将直引号转换为弯引号–from 知乎-Francis Feng

许多编辑环境下(包括 OS X 的默认系统设置)会根据上下文将直引号转换为弯引号。中文输入法也是普遍使用弯引号(主要其实是因为简中弯引号占一字宽并偏向内侧,和比例宽度的直引号差别过大)。 –from 知乎-梁海

也是看了这个之后,大体明白了为什么会从直引号切换成弯引号。大体是系统做了处理,根据上下文将直引号转换为弯引号。然后再去Google了smart quotes,于是看到这篇资料NSTextView with Smart Quotes disabled, still replaces quotes。

NSTextChecking

这里写图片描述
反思: 其实一开始就有尝试禁用smart Quotes特性,无法禁用成功后,有常识去系统API中查找该属性,但搜索关键字是smartQuotes并未找到,也没多想就错过了解决问题的契机。还是应该静下心慢慢的认真查看系统API,以及搜索关键字的技巧还需提高。

automaticQuoteSubstitutionEnabled属性

If YES, automatic quotation mark substitution is enabled; if NO, it is disabled.
Automatic quote substitution causes ASCII quotation marks and apostrophes to be automatically replaced, on a context-dependent basis, with more typographically accurate symbols. – Apple

解决方案:将automaticQuoteSubstitutionEnabled设为NO,即可禁用引号的智能替换功能。(ps:storyboard中NSTextView的smart Quotes属性对应的应该就是这一属性,照理禁用后应该是不会智能替换。目前怀疑是Xcode的问题[如若知晓,欢迎指正!])
也可通过enabledTextCheckingTypes将所有自动转换类型禁用。

参考资料

Apple-NSTextView-automaticQuoteSubstitutionEnabled
NSTextView with Smart Quotes disabled, still replaces quotes
MacOSX: how to disable accented characters input
为什么 iOS 自带的输入法中的英文引号采用的是「”」

0 0
原创粉丝点击