iOS全角符与半角符之间的转换、中文转汉语拼音以及去掉音调符
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』都支持逆转
















