Mattt 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    Output
kCFStringTransformLatinArabic    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的温暖怀抱的许多强大特性之一。

CFString​Transform相关推荐

  1. css3之transition、transform、animation比较

    css3动画多少都有些了解,但是对于transition.transform.animation这几个属性一直是比较模糊的,所以啊,这里做一个总结,也希望大家都可以对此有一个更好地理解.    其实, ...

  2. 基于css3 transform实现散乱的照片排列

    分享一款基于css3 transform实现散乱的照片排列.这是一款简单零散的css3相册排列特效下载.效果图如下: 在线预览    源码下载 实现的代码. html代码: <div class ...

  3. OpenCV中的尺度不变特征变换(SIFT Scale-Invariant Feature Transform)

    OpenCV中的尺度不变特征变换(SIFT Scale-Invariant Feature Transform) 1. 效果图 2. 原理 2.1 步骤 2.2 opencv实现方法 2.3 SIFT ...

  4. FT(Fourier Transform)在滤波上的应用

    数学真的是一个神奇的科学,美妙之处无法言语形容. 傅里叶变换的推导见博客: 对于非周期的函数就是周期T趋于0,将一般非周期的函数写作傅里叶级数的形式: 其中:就是FT(Fourier Transfor ...

  5. transform总结

    1. 用jquery的css方法获取transform得到的是矩阵matrix,不利于获取translate的值, 优先使用dom.style.webKitTransform进行transform的读 ...

  6. 放大 旋转 css3,CSS3详解:transform 的旋转、旋转放大、放大、移动

    CSS3 transform是什么? transform的含义是:改变,使-变形:转换 CSS3 transform都有哪些常用属性? transform的属性包括:rotate() / skew() ...

  7. std::transform使用

    std::transform在指定的范围内应用于给定的操作,并将结果存储在指定的另一个范围内. 以下是std::transform的两个声明,一个是对应于一元操作,一个是对应于二元操作 templat ...

  8. C++ transform for_each

    #include<iostream> #include<vector> #include <list> #include <algorithm> #in ...

  9. 三棱锥四面体html css,CSS transform属性实现旋转的四面体

    原创声明 本文系作者辛苦码字所得,欢迎分享和转载,但请在明显位置注明作者的如下信息: 笔名:来碗鸡蛋面 简书主页:https://www.jianshu.com/u/4876275b5a73 邮箱:j ...

最新文章

  1. C#中将结构类型数据存储到二进制文件中方法
  2. 序列化模块--json模块--pickle模块-shelve模块
  3. 费解!为什么那么多人用“ji32k7au4a83”作密码?
  4. yunyang tensorflow-yolov3 Intel Realsense D435 (并发)使用locals()函数批量配置摄像头运行识别程序并画框(代码记录)(代码示例)
  5. 通过CSS样式隐藏百度版权标志
  6. Rails I18n验证弃用警告
  7. matlab分析分子动力学,分子动力学程序框架
  8. 扫盲:什么是steam令牌验证器?哪些行为会触发steam交易限制
  9. 微信公众号推送模板消息(四):Java调用实现模板消息推送
  10. [django]梳理drf知识点
  11. lopa分析_保护层分析(LOPA)
  12. dperf: 一款基于DPDK的千万级HTTP CPS的开源网络压力测试仪
  13. 01-小程序UI组件库
  14. Linux 平台下 误删 oracle 数据文件的恢复方法
  15. 氨氮废水吸附处理工艺——树脂吸附
  16. matlab编写的卡农,matlab 编的卡农
  17. Magic Leap开发指南(3)-- 将你的Cube投递给其他用户
  18. numpy.ix_()函数
  19. 《顶级摄影器材》系列丛书首发式上海隆重举办
  20. 计算机无法启动命令,你的电脑未正确启动怎么用命令提示符修复

热门文章

  1. datetime 和 smalldatetime
  2. Redhat linux5.5下Oracle 10g 安装配置手册一
  3. 改进C#代码之24:通过定义并实现接口替代继承
  4. Maven详解(二)------ Maven的安装配置
  5. Python核心编程(第二版)第六章部分习题代码
  6. mysql5.7 数据表的基本操作
  7. ACdream1032(树形DP)
  8. IDEA实际开发中的常用优化设置
  9. 如何运营一个合法的经营性网站?办理经营性ICP证!
  10. 利用交换机解决局域网ARP问题(51CTO博客出书活动)