iOS全角符与半角符之间的转换

相关资料:

问题

  • 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、首先来看一下函数『CFString​Transform』的说明:

    正如它的 CF 前缀所表述的一样,CFStringTransform 是 Core Foundation 中的一部分。这个函数传入以下参数,并返回一个 Boolean 来表示转换是否成功:

    • string: 需要转换的字符串。由于这个参数是 CFMutableStringRef 类型,一个 NSMutableString 类型也可以通过自由桥接的方式传入。
    • range: 转换操作作用的范围。这个参数是 CFRange,而不是 NSRange。
    • transform: 需要应用的变换。这个参数使用了包含下面将提到的字符串常量的 ICU transform string。
    • reverse: 如有需要,是否返回反转过的变换。
  • 2、我们来看一下『Transform identifiers for CFStringTransform』:

      k​CFString​Transform​Strip​Combining​Marks
    The identifier of a transform to strip combining marks (accents or diacritics). k​CFString​Transform​To​Latin
    The identifier of a transform to transliterate all text possible to Latin script. Ideographs are transliterated as Mandarin Chinese. k​CFString​Transform​Fullwidth​Halfwidth
    The identifier of a reversible transform to convert full-width characters to their half-width equivalents. k​CFString​Transform​Latin​Katakana
    The identifier of a reversible transform to transliterate text to Katakana from Latin. k​CFString​Transform​Latin​Hiragana
    The identifier of a reversible transform to transliterate text to Hiragana from Latin. k​CFString​Transform​Hiragana​Katakana
    The identifier of a reversible transform to transliterate text to Katakana from Hiragana. k​CFString​Transform​Mandarin​Latin
    The identifier of a transform to transliterate text to Latin from ideographs interpreted as Mandarin Chinese. This transform is not reversible. k​CFString​Transform​Latin​Hangul
    The identifier of a reversible transform to transliterate text to Hangul from Latin. k​CFString​Transform​Latin​Arabic
    The identifier of a reversible transform to transliterate text to Arabic from Latin. k​CFString​Transform​Latin​Hebrew
    The identifier of a reversible transform to transliterate text to Hebrew from Latin. k​CFString​Transform​Latin​Thai
    The identifier of a reversible transform to transliterate text to Thai from Latin. k​CFString​Transform​Latin​Cyrillic
    The identifier of a reversible transform to transliterate text to Cyrillic from Latin. k​CFString​Transform​Latin​Greek
    The identifier of a reversible transform to transliterate text to Greek from Latin. k​CFString​Transform​To​XMLHex
    The identifier of a reversible transform to transliterate characters other than printable ASCII to XML/HTML numeric entities. k​CFString​Transform​To​Unicode​Name
    The identifier of a reversible transform to transliterate characters other than printable ASCII (minus braces) to their Unicode character name in braces. k​CFString​Transform​Strip​Diacritics
    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 实际上是『片假名』与『平假名』之间的转换,『CFString​Transform』函数中的 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』都支持逆转

iOS全角符与半角符之间的转换的更多相关文章

  1. Java 全角字符转半角字符

    1.java代码里有时候会遇到代码注入的安全问题,为了防止这种问题,增加了一个过滤功能.主要是过滤全角字符,把url不能识别的全角字符转换成半角字符 public class Test { publi ...

  2. php全角字符转换为半角函数

    <?php /** * 全角字符转换为半角 * * @param string $str * @return string public function Sbc2Dbc($str) { $ar ...

  3. php全角字符转换为半角函数 实例代码

    PHP全角半角转换函数,把目前能找到的所有全角都列出来了一个个替换吧. 之前试过网上找的通过ASCII之类的字符替换,发现很多莫名其妙的问题.最后还是换成下面的字符替换方式了,把目前能找到的所有全角都 ...

  4. js全角字符转为半角字符

    //全角转半角 function CtoH(str){ var result=""; for (var i = 0; i < str.length; i++){ if (st ...

  5. 关于JAVA正则匹配空白字符的问题(全角空格与半角空格)

    今天遇到一个字符串,怎么匹配空格都不成功!!! 我把空格复制到test.properties文件 显示“\u3000” ,这是什么? 这是全角空格!!! 查了一下    \s    不支持全角 1.& ...

  6. c# winform 全角自动转化半角问题(C#中ImeMode的值):转载

    调用 this.ImeMode = ImeMode.OnHalf; ImeMode 枚举:指定一个值,该值是用来确定在选定了对象时该对象的输入法编辑器 (IME) 的状态. 以下是微软的解释: 成员名 ...

  7. C# 全角符号转半角

    public static string SBCCaseToNumberic(string SBCCase) { char[] c = SBCCase.ToCharArray(); ; i < ...

  8. JS INPUT输入的时候全角自动转为半角

    function CtoH(obj){var str=obj.value;var result="";for (var i = 0; i < str.length; i++) ...

  9. Java全角、半角字符的关系以及转换

    如果搞明白了Java中全角字符和半角字符之间的关系,那他们之间的转换就不是个麻烦事儿.你只需要对这个关系有那么一个印象就足够了. 全角字符与半角字符的关系 通过下面的代码能看到Java中所有字符以及对 ...

随机推荐

  1. samentic 在IE9 不支持 transition 的解决方案

    本文原文链接为:http://www.cnblogs.com/jying/p/6377696.html  ,转载请注明出处. 在使用samentic过程中遇到 IE9 下报如下错误: 查阅了好多资料终 ...

  2. 列存储段消除(ColumnStore Segment Elimination)

    列存储索引是好的!对于数据仓库和报表工作量,它们是真正的性能加速器.与聚集列存储结合,你会在常规行存储索引(聚集索引,非聚集索引)上获得巨大的压缩好处.而且创建聚集列存储索引非常简单: CREATE ...

  3. VS中生成debug和release的小问题

    vs里生成dll,需要在解决方案上右键"属性",然后"配置",点击右上角"配置管理器(0)",选择debug或release,方可生效.不然 ...

  4. C++ 头文件系列(ios)

    1 简介 我们都知道,平时常用的那些标准流,诸如iostream.ofstream.ifstream等等,其实都是对应的basic_XXX模版的实例类. 而这些basic_XXX类模版又都是继承自同一 ...

  5. select中的文字垂直居中的问题

    select文字在默认和边框高度增加时 是默认居中的.你要是不想居中的话可以用padding值调整.但是右侧的三角不会改变. select在高度减小时.字体是不会垂直居中的.无论你用什么他都不会垂直居 ...

  6. oracle 游标的使用

    额,一直提起游标就头疼,总感觉是很高大上的东西,望而却步... 今天要做的东西涉及到了实时更新数据,要用到JOB 存储过程  游标 通过在网上查资料,请教同事,也开始继续深入oracle,,,,小菜啊 ...

  7. Hangfire 使用笔记

    “巨人们”的地址 Hangfire Mysql: https://github.com/arnoldasgudas/Hangfire.MySqlStorage 在获取set表数据的sql语句有bug ...

  8. JAVA中的数据结构 - 真正的去理解红黑树

    一, 红黑树所处数据结构的位置: 在JDK源码中, 有treeMap和JDK8的HashMap都用到了红黑树去存储 红黑树可以看成B树的一种: 从二叉树看,红黑树是一颗相对平衡的二叉树 二叉树--&g ...

  9. js常见算法

    1:实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number.String.Object.Array.Boolean)进行值复制. function clone(Ob ...

  10. 关于C语言中变量类型转换

    今天在工作中遇到一个问题,而在解决问题的过程中,发现一段关于int 型变量(a)和char型(b)变量间类型转换的代码存在问题:一个值为255的int型变量a,强制类型转换并赋值给char型变量b后, ...