http://nshipster.cn/cfstringtransform/CFStringTransformMattt Thompson撰写、 Ricky Tan翻译、 发布于2012年8月6日关于一种语言好不好用,你只需要衡量以下两种指标:API 的统一性String 类的实现质量NSString 是基础类库中的佼佼者。在那个其他语言 仍在 艰难地正理处理 Unicode 的时代,NSString 是尤其让人印象深刻的。不仅仅是任何内容扔在它里面就能 正确工作 ,NSString 还能将字符串解析成语法标签、检测出内容中的首要语言,并且在任意你能想到的字符编码中转换。它好用得离谱。它虽然很强大,但是不提提它的可无缝转换(toll-free bridged)的表兄弟 CFMutableString,或者更特殊的 CFStringTransform,是不负责任的。正如它的 CF 前缀所表述的一样,CFStringTransform 是 Core Foundation 中的一部分。这个函数传入以下参数,并返回一个 Boolean 来表示转换是否成功:string: 需要转换的字符串。由于这个参数是 CFMutableStringRef 类型,一个 NSMutableString 类型也可以通过自由桥接的方式传入。range: 转换操作作用的范围。这个参数是 CFRange,而不是 NSRange。transform: 需要应用的变换。这个参数使用了包含下面将提到的字符串常量的 ICU transform string。reverse: 如有需要,是否返回反转过的变换。CFStringTransform 中的 transform 参数涉及的内容很多。这里有个它能做什么的概述:去掉重音和变音符Énġlišh långuãge lẳcks iñterêßţing diaçrïtičş. 如此类的字符串,把扩展的拉丁字符集正则化为 ASCII 友好型的表示,它非常有用。用 kCFStringTransformStripCombiningMarks 变换来去掉任意字符串中弯弯扭扭的符号。为 Unicode 字符命名kCFStringTransformToUnicodeName 让你可以找出特殊字符的 Unicode 标准名,包括 Emoji。例如:"✨" 被转换成 "{SHEEP} {DASH SYMBOL} {SPARKLES}",而 "" 变成了 "{PIG FACE}"。不同拼写之间转写除了英语这个重大例外(和它那令人愉快的拼写不一致),书写系统一般是将语言音调编码成一致的符号表示。欧洲语言一般使用拉丁字母(外加一些变音符),俄罗斯用西里尔字母,日本用平假名和片假名,泰国、韩国和阿拉伯国家也都有自己的字母。虽然每种语言都有特殊的音调列表,也许有些其他语言会缺失,所有主要书写系统的交集已经足以让你高效的在不同字母之间转写(不要跟翻译搞混了)。CFStringTransform 可以在拉丁语和阿拉伯语、西里尔语、希腊语、韩语(韩国)、希伯来语、日语(平假名和片假名)、普通话、泰语之间来回转写。Transformation Input OutputkCFStringTransformLatinArabic mrḥbạ مرحباkCFStringTransformLatinCyrillic privet приветkCFStringTransformLatinGreek geiá sou γειά σουkCFStringTransformLatinHangul annyeonghaseyo 안녕하세요kCFStringTransformLatinHebrew şlwm שלוםkCFStringTransformLatinHiragana hiragana ひらがなkCFStringTransformLatinKatakana katakana カタカナkCFStringTransformLatinThai s̄wạs̄dī สวัสดีkCFStringTransformHiraganaKatakana にほんご ニホンゴkCFStringTransformMandarinLatin 中文 zhōng wén并且这只是用了核心类库中常量定义!直接传入一个ICU transform表达式,CFStringTransform 还可以在拉丁语和阿拉伯语、亚美尼亚语、注音、西里尔字母、格鲁吉亚语、希腊语、汉语、韩语、希伯来语、平假名、印度语(梵文,古吉拉特语,旁遮普文,卡纳达语,马拉雅拉姆语,奥里雅语,泰米尔语,特卢固)、朝鲜语、片假名、叙利亚语、塔纳文、泰语之间转写。正则化用户产生的内容字符串变换的一个更实际的应用是正则化不可预知的用户输入。即使你的应用并不单独处理其他语言,你也应当能智能地处理用户向你的应用输入的任何内容。例如,你想在设备上建立一个可搜索的电影索引,它包含世界各地的人的问候:首先,应用 kCFStringTransformToLatin 变换将所有非英文文本转换为拉丁字母表示。Hello! こんにちは! สวัสดี! مرحبا! 您好! → Hello! kon'nichiha! s̄wạs̄dī! mrḥbạ! nín hǎo!然后,应用 kCFStringTransformStripCombiningMarks 变换来去除变音符和重音。Hello! kon'nichiha! s̄wạs̄dī! mrḥbạ! nín hǎo! → Hello! kon'nichiha! swasdi! mrhba! nin hao!最后,用 CFStringLowercase 转为小写,并用CFStringTokenizer 分词用作文本的索引。(hello, kon'nichiha, swasdi, mrhba, nin, hao)通过对用户输入的文本使用同样的变换,你就可以实现一个通用的搜索,无论搜索文本或内容是什么语言!CFStringTransform 会是个用来按你的要求处理语言的十分强大的工具。并且它是,且仅仅是等着你勇敢地投入Objective-C的温暖怀抱的许多强大特性之一。作者Mattt ThompsonMattt ThompsonMattt Thompson (@mattt) is the creator & maintainer of AFNetworking and other popular open-source projects, including Postgres.app, ASCIIwwdc and Nomad.翻译者Ricky TanRicky Tan 是iZJU iOS 版 3.1.3 以前版本及后台、Xcode 插件 RTImageAssets 的开发者,另有浙大网址导航 iStudy Chrome 插件等。更多请移步。下一篇文章NSIncrementalStore即使这个博客就是专门讲一些晦涩接口,但是NSIncrementalStore又刷新了我们对与“晦涩”这个词的理解。这个接口在iOS 5中被发布,相对于其他大家一定会用到的条目,它并没有在更新日志里有更着重的声明。但是讽刺的是,它有可能是iOS 5的API里最重要的一个,它将从现在开始改变我们创建应用的方式。相关文章NSLocaleNSDateComponentsNSFileManagerNSIndexSet 除非另有声明、本网站采用知识共享「署名-非商业性使用 3.0 中国大陆」许可协议授权。本站文章由 Croath Liu 、 、 Delisa Mason 、 Jack Flintermann 、 Mattt Thompson 、 、 Mike Lazer-Walker 、 Natasha Murashev 和 Nate Cook 撰写、 Andrew Yang 、 April Peng 、 Bob Liu 、 Candyan 、 Chester Liu 、 Croath Liu 、 David Liu 、 GWesley 、 Henry Lee 、 JJ Mao 、 Lin Xiangyu 、 Ricky Tan 、 Sheldon Huang 、 Tiny Tian 、 Tony Li 、 Yifan Xiao 、 Yu Jin 和 Zihan Xu 翻译。