iOS全角符與半角符之間的轉換
相關資料:
- 函數『CFStringTransform』中文 詳情;
問題
-
1、17-03-15,「有人在群里邊問怎么把『半角』符字符串轉換成『全角』字符串?」,百度的結果如下:
-
全角轉半角方法如下(略有出入,原文使用的是『MRC』,現在使用的『ARC』):
NSString * string = @"abcdefg,"; NSMutableString *convertedString = [string mutableCopy]; CFStringTransform((CFMutableStringRef)convertedString, NULL, kCFStringTransformFullwidthHalfwidth, false); NSLog(@"ddc:%@",convertedString);
-
輸出結果:
ddc:abcdefg,
-
結果轉換成功。
-
-
半角轉全角只需要把 kCFStringTransformFullwidthHalfwidth 換成kCFStringTransformHiraganaKatakana 即可。
NSString * string = @"abcdefg,"; NSMutableString *convertedString = [string mutableCopy]; CFStringTransform((CFMutableStringRef)convertedString, NULL, kCFStringTransformHiraganaKatakana, false); NSLog(@"ddc:%@",convertedString);
-
輸出結果:
ddc:abcdefg,
-
結果轉換失敗。
-
-
解決
-
1、首先來看一下函數『CFStringTransform』的說明:
正如它的 CF 前綴所表述的一樣,CFStringTransform 是 Core Foundation 中的一部分。這個函數傳入以下參數,並返回一個 Boolean 來表示轉換是否成功:
- string: 需要轉換的字符串。由於這個參數是 CFMutableStringRef 類型,一個 NSMutableString 類型也可以通過自由橋接的方式傳入。
- range: 轉換操作作用的范圍。這個參數是 CFRange,而不是 NSRange。
- transform: 需要應用的變換。這個參數使用了包含下面將提到的字符串常量的 ICU transform string。
- reverse: 如有需要,是否返回反轉過的變換。
-
2、我們來看一下『Transform identifiers for CFStringTransform』:
kCFStringTransformStripCombiningMarks The identifier of a transform to strip combining marks (accents or diacritics). kCFStringTransformToLatin The identifier of a transform to transliterate all text possible to Latin script. Ideographs are transliterated as Mandarin Chinese. kCFStringTransformFullwidthHalfwidth The identifier of a reversible transform to convert full-width characters to their half-width equivalents. kCFStringTransformLatinKatakana The identifier of a reversible transform to transliterate text to Katakana from Latin. kCFStringTransformLatinHiragana The identifier of a reversible transform to transliterate text to Hiragana from Latin. kCFStringTransformHiraganaKatakana The identifier of a reversible transform to transliterate text to Katakana from Hiragana. kCFStringTransformMandarinLatin The identifier of a transform to transliterate text to Latin from ideographs interpreted as Mandarin Chinese. This transform is not reversible. kCFStringTransformLatinHangul The identifier of a reversible transform to transliterate text to Hangul from Latin. kCFStringTransformLatinArabic The identifier of a reversible transform to transliterate text to Arabic from Latin. kCFStringTransformLatinHebrew The identifier of a reversible transform to transliterate text to Hebrew from Latin. kCFStringTransformLatinThai The identifier of a reversible transform to transliterate text to Thai from Latin. kCFStringTransformLatinCyrillic The identifier of a reversible transform to transliterate text to Cyrillic from Latin. kCFStringTransformLatinGreek The identifier of a reversible transform to transliterate text to Greek from Latin. kCFStringTransformToXMLHex The identifier of a reversible transform to transliterate characters other than printable ASCII to XML/HTML numeric entities. kCFStringTransformToUnicodeName The identifier of a reversible transform to transliterate characters other than printable ASCII (minus braces) to their Unicode character name in braces. kCFStringTransformStripDiacritics The identifier of a transform to remove diacritic markings.
具體的自己翻譯哈啊(附表一部分翻譯結果 來源):
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 |
-
3、於是乎 kCFStringTransformHiraganaKatakana 實際上是『片假名』與『平假名』之間的轉換,『CFStringTransform』函數中的 reverse 參數意思是轉換過程是否可逆;
NSString * string = @"abcdefg,"; NSMutableString *convertedString = [string mutableCopy]; CFStringTransform((CFMutableStringRef)convertedString, NULL, kCFStringTransformFullwidthHalfwidth, true); NSLog(@"ddc:%@",convertedString);
-
輸出結果:
ddc:abcdefg,
-
結果轉換成功。
-
彩蛋
-
請嘗試下列代碼:
NSString * string = @"我是中文"; NSMutableString *convertedString = [string mutableCopy]; CFStringTransform((CFMutableStringRef)convertedString, NULL, kCFStringTransformMandarinLatin, false); NSLog(@"轉換結果:%@",convertedString); CFStringTransform((CFMutableStringRef)convertedString, NULL, kCFStringTransformStripDiacritics, false); NSLog(@"轉換結果:%@",convertedString);
轉換結果:wǒ shì zhōng wén
轉換結果:wo shi zhong wen備注以上代碼是中文轉漢語拼音以及去掉音調符
備注
- 請注意不是所有的『Transform identifiers』都支持逆轉