问题描述
在NSTextView中输入json的双引号时,输入法为英文,但显示的是中文的引号。而且在输入过程中能感觉到英文引号替换成中文引号。再试了下单引号也存在该问题,而!,@,#等字符不存在该问题。
猜测:是系统对引号做了特殊处理,在输入引号的时候将输入法更改为中文输入法吗?
尝试1:实在是不知从何入手,查看了下NSTextView中的API,尝试了下重写-insertText,识别到输入中文引号,就重写成insertText:@”\”“,但是其实在输入英文引号的时候,insertText识别的也是英文的引号。所以这种思路其实是不可行的,是在显示时(insertText后)则切换成中文引号了。
尝试2: 在storyboard中,NSTextView属性smart Quotes,智能引号默认是开启的,尝试了下禁用,但仍然没有解决(其实就是这个原因,但这里是因为xcode的bug,导致属性失效)。
直引号与弯引号
弯引号:「typographic, or curly quotation marks」
直引号:「neutral, vertical, straight, typewriter, or dumb quotation marks」,又叫dumb quotes傻瓜引号
直引号本是打字机时代为了尽量节约键盘空间而制作出来的。
现代的键盘和 ASCII 字符集都继承了这个传统——ASCII 中只有一个单直引号(U+0027 ’ apostrophe)和一个双直引号(U+0022 ” quotation mark)。
一些文字处理软件(如 Word),能自动将直引号转换为弯引号。
许多编辑环境下(包括 OS X 的默认系统设置)会根据上下文将直引号转换为弯引号。
中文输入法也是普遍使用弯引号(主要其实是因为简中弯引号占一字宽并偏向内侧,和比例宽度的直引号差别过大)。
解决方案
这个解决方案在Stack Overflow上已经有了
将automaticQuoteSubstitutionEnabled设为NO,即可禁用引号的智能替换功能。
Storyboard中NSTextView的smart Quotes属性对应的应该就是这一属性,照理禁用后应该是不会智能替换,怀疑是Xcode的Bug
当然也可通过enabledTextCheckingTypes将所有自动转换类型禁用。
网友评论