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的溫暖懷抱的許多強大特性之一。工具