CFString​Transform

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

时间: 2025-01-25 12:23:10

CFString​Transform的相关文章

javascript-jquery的animate函數为啥不支持transform?

问题描述 jquery的animate函數为啥不支持transform? jQuery的animate函数,为啥不支持改变transform属性值的动画? $().animate({"transform":"rotate(90deg)"},200,"linear"); 解决方案 css3要结合transition,不需要用animate,用css就行 <script src="http://ajax.aspnetcdn.com/a

zoom和transform:scale的区别

一.IE和Chrome等浏览器与zoom 还在几年前,zoom还只是IE浏览器自己私有的玩具,但是,现在,除了FireFox浏览器,其他,尤其Chrome和移动端浏览器已经很好支持zoom属性了: zoom的字面意思是"变焦",摄影的时候常用到的一个概念.对于web上的zoom效果,你也可以按照此概念理解.可以改变页面上元素的尺寸,属于真实尺寸. 在旧的web时代.*zoom: 1可以给IE6/IE7浏览器增加haslayout, 用来清除浮动,修复一些布局上的疑难杂症等. 其支持的值

transform你不知道的那些事

 transform是诸多css3新特性中最打动我的,因为它让方方正正的box module变得真实了. transform通过一组函数实现了对盒子大小.位置.角度的2D或者3D变换.不过很长时间内,我对以下问题都想不太明白: 1.尺寸缩放scale与zoom变换有何不同,为什么被scale的盒子里的内容不会错位,但zoom不是. 2.位移(transform:translate)与相对定位.绝对定位(position:relative absolute)有何关系? 3.在实际项目中发现,位图(

CSS3 Transform变形理解与应用

Transform:对元素进行变形: Transition:对元素某个属性或多个属性的变化,进行控制(时间等),类似flash的补间动画.但只有两个关键贞.开始,结束. Animation:对元素某个属性或多个属性的变化,进行控制(时间等),类似flash的补间动画.可以设置多个关键贞.   Transition与Animation: transition需要触发一个事件 ,而animation在不需要触发任何事件的情况下也可以显式的随着时间变化来改变元 素css的属性值,从而达到一种动画的效果

CSS3变形属性:CSS3 3D Transform

文章简介:作为一个网页设计师,你可能熟悉在二维空间工作,但是在三维空间上工作并不太熟悉.使用二维变形我们能够改变元素在水平和垂直轴线,然而还有一个轴沿着它,我们可以改变元素.使用三维变形,我们可以改变元素在Z轴位置. 三维变换使用基于二维变换的相同属性,如果您熟悉二维变换,你们发现3D变形的功能和2D变换的功能相当类似.CSS3中的3D变换主要包括以下几种功能函数: 3D位移:CSS3中的3D位移主要包括translateZ()和translate3d()两个功能函数: 3D旋转:CSS3中的3

CSS3的transform知识:详解transform

文章简介:在这篇文章,回顾了CSS3的transform的基本知识,然后深入介绍了transform-origin的相关知识. 在CSS2.1中,我们的页面都是静态的,网页设计师也习惯把它作为页面效果的设计工具.但往往有些页面效果不只是静态的,比如说,如何实际移动一些元素?如何更改元素的外观--旋转或缩放? 多年来,Web设计师为了给修改页面的外观,都依赖于图片.Flash或JavaScript才能完成.不过,CSS3将要改变设计师这种思维,进入CSS3时代,借助CSS3就可以轻松倾斜.缩放.移

transform中transform

文章简介:今天将和大家一起探讨transform中transform-style和perspective相关属性的使用. 今天将和大家一起探讨transform中transform-style和perspective相关属性的使用. transform-style属性 transform-style属性是3D空间一个重要属性,指定嵌套元素如何在3D空间中呈现.他主要有两个属性值:flat和preserve-3d. transform-style属性的使用语法非常简单: transform-sty

CSS3 Transform的perspective属性

文章简介:CSS3 Transform的perspective属性. 以下两行语句有什么区别? <div id="animateTest" style="-webkit-transform: perspective(400px) rotateY(40deg);"> <div id="animateTest" style="-webkit-transform: rotateY(40deg) perspective(400

css3动画transform属性系列之scale(缩放)

下面我们从3个方面开始介绍: 1.scale(x,y) 对元素进行缩放 X表示水平方向缩放的倍数 Y表示垂直方向的缩放倍数 Y是一个可选参数,没有设置的话,则表示X,Y两个方向的缩放倍数是一样的.并以X为准. transform:scale(2,2.5); 2.scaleX(<number>) 元素只在X轴(水平方向)缩放元素. 默认值是1,基点一样在元素的中心位置.可以通过transform-origin来改变基点 transform:scaleX(2); 3.scaleY(<numb