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』都支持逆转