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);
备注
- 请注意不是所有的『Transform identifiers』都支持逆转