美文网首页
NSString+YYAdd的学习

NSString+YYAdd的学习

作者: _阿南_ | 来源:发表于2017-10-24 17:58 被阅读73次
    图片来之网络

    NSString的内容好丰富啊,学习了很久很久,也补充了不熟悉的内容。

    算法了解

    • Hash算法: 将任意长度的消息压缩到某一固定长度的消息摘要的函数。
    • MD5: 将消息运算为一固定的长度值,保证消息的完整性。 (Hash的一种)
    • HMAC: 秘钥相关的哈希运算消息认证码,以一个秘钥和一个消息的输入,生成一个消息摘要作为输出。 (Hash的一种)
    • CRC: 循环冗余校验码,一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接受设备也执行类似的算法,以保证数据传输的正确性和完整性。
    • AES: 高级加密标准。

    从来没有研究过算法的具体细节,直接copy一个代码然后大功告成。

    String添加char

    NSMutableString *result = [NSMutableString string];
    unichar c = '2';
    CFStringAppendCharacters((CFMutableStringRef)result, &c, 1);
    

    NSString的方法真当是多啊,很多没有用到过,也没研究过。

    金额计算使用

    NSDecimalNumber *rest = [NSDecimalNumber decimalNumberWithString:@"2.12"];
    NSLog(@"rest is %f", [rest floatValue]);
    NSLog(@"rest is %f", [rest doubleValue]);
    NSDecimalNumber *point = [NSDecimalNumber decimalNumberWithString:@"1.33"];
    NSDecimalNumber *result = [rest decimalNumberBySubtracting:point];
    NSLog(@"result is %@.", result);
    

    常常碰到计算金额的时候精度问题,最好的办法是计算全部是服务器。如果要在本地就不要使用float和double了。

    NSStringEncoding

    typedef NSUInteger NSStringEncoding;
    NS_ENUM(NSStringEncoding) {
        NSASCIIStringEncoding = 1,      /* 0..127 only */
        NSNEXTSTEPStringEncoding = 2,
        NSJapaneseEUCStringEncoding = 3,
        NSUTF8StringEncoding = 4,
        NSISOLatin1StringEncoding = 5,
        NSSymbolStringEncoding = 6,
        NSNonLossyASCIIStringEncoding = 7,
        NSShiftJISStringEncoding = 8,          /* kCFStringEncodingDOSJapanese */
        NSISOLatin2StringEncoding = 9,
        NSUnicodeStringEncoding = 10,
        NSWindowsCP1251StringEncoding = 11,    /* Cyrillic; same as AdobeStandardCyrillic */
        NSWindowsCP1252StringEncoding = 12,    /* WinLatin1 */
        NSWindowsCP1253StringEncoding = 13,    /* Greek */
        NSWindowsCP1254StringEncoding = 14,    /* Turkish */
        NSWindowsCP1250StringEncoding = 15,    /* WinLatin2 */
        NSISO2022JPStringEncoding = 21,        /* ISO 2022 Japanese encoding for e-mail */
        NSMacOSRomanStringEncoding = 30,
    
        NSUTF16StringEncoding = NSUnicodeStringEncoding,      /* An alias for NSUnicodeStringEncoding */
    
        NSUTF16BigEndianStringEncoding = 0x90000100,          /* NSUTF16StringEncoding encoding with explicit endianness specified */
        NSUTF16LittleEndianStringEncoding = 0x94000100,       /* NSUTF16StringEncoding encoding with explicit endianness specified */
    
        NSUTF32StringEncoding = 0x8c000100,                   
        NSUTF32BigEndianStringEncoding = 0x98000100,          /* NSUTF32StringEncoding encoding with explicit endianness specified */
        NSUTF32LittleEndianStringEncoding = 0x9c000100        /* NSUTF32StringEncoding encoding with explicit endianness specified */
    };
    
    NSASCIIStringEncoding = 1

    ASCII码的值0...127。
    按ASCII编码的字符串,强制转化为其他的编码类型时,除了NSUnicodeStringEncoding,NSUTF16StringEncoding,NSUTF16BigEndianStringEncoding,NSUTF16LittleEndianStringEncoding,NSUTF32StringEncoding,NSUTF32BigEndianStringEncoding,NSUTF32LittleEndianStringEncoding返回为乱码或空外,其他的编码类型返回正常。

    NSNEXTSTEPStringEncoding = 2,

    8bit的ASCII码的NEXTSTEP扩展。
    NEXTSTEP是乔布斯创立的公司,后来被苹果公司收购。应该是为了兼容才添加了这个类型。

    NSJapaneseEUCStringEncoding = 3,

    8bit的EUC编码,为日本文字提供兼容的一个编码格式。

    NSUTF8StringEncoding = 4,

    Unicode的一种实现方案,8不是指使用8位来标识文字,而是使用可变字节,最多4个字节。特点是:不同范围的字符使用不同长度的编码。
    编码规则:
    Unicode编码(16进制)  ║ UTF-8 字节流(二进制)  
    000000 - 00007F  ║ 0xxxxxxx   
    000080 - 0007FF  ║ 110xxxxx 10xxxxxx   
    000800 - 00FFFF  ║ 1110xxxx 10xxxxxx 10xxxxxx   
    010000 - 10FFFF  ║ 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

    编码格式的检测:字节序标志头(文件前面的BOM头,可以判断编码格式)
    UTF编码 ║ Byte Order Mark   
    UTF-8 ║ EF BB BF   
    UTF-16LE ║ FF FE   
    UTF-16BE ║ FE FF   
    UTF-32LE ║ FF FE 00 00   
    UTF-32BE ║ 00 00 FE FF

    NSISOLatin1StringEncoding = 5,

    8bit的国际标准的拉丁文编码。

    NSSymbolStringEncoding = 6,

    8bit的Adobe符号编码矢量。

    NSNonLossyASCIIStringEncoding = 7,

    7bit的冗长ASCII码表示所有的Unicode字符。

    NSShiftJISStringEncoding = 8, /* kCFStringEncodingDOSJapanese */

    为日本文字提供兼容的,8bit的Shift-JIS编码。
    Shift-JIS是日本电脑系统最常用的编码表。

    NSISOLatin2StringEncoding = 9,

    8bit的国际标准的拉丁文2编码。

    NSUnicodeStringEncoding = 10,

    字符串对象的标准的Unicode编码。

    NSWindowsCP1251StringEncoding = 11, /* Cyrillic; same as AdobeStandardCyrillic */

    Windows系统的代码页1251,斯拉夫字母的字符编码。与AdobeStandardCyrillic字体编码等价。

    CodePage(代码页),因为ANSI编码在每个国家都不统一,不兼容,可能导致冲突,所以在处理文字的时候,必须要告诉计算机你的ANSI是哪个国家和地图的标准,这个就叫代码页。

    NSWindowsCP1252StringEncoding = 12, /* WinLatin1 */

    Windows系统的代码页1252,等价于WinLatin1编码。

    NSWindowsCP1253StringEncoding = 13, /* Greek */

    Windows系统的代码页1253,Greek字符编码。

    NSWindowsCP1254StringEncoding = 14, /* Turkish */

    Windows系统的代码页1253,Turkish字符编码。

    NSWindowsCP1250StringEncoding = 15, /* WinLatin2 */

    Windows系统的代码页1250,等价于WinLatin2编码。

    NSISO2022JPStringEncoding = 21, /* ISO 2022 Japanese encoding for e-mail */

    国际标准2022的日本电子邮件编码。

    NSMacOSRomanStringEncoding = 30,

    经典的Macintosh罗马编码。

    Macintosh是苹果公司生产的一种型号的计算机。

    NSUTF16StringEncoding = NSUnicodeStringEncoding, /* An alias for NSUnicodeStringEncoding */

    以16位无符号整数为单位。注意16位为一个单位,不表示一个字符就只有16位。绝大部分2个字节,有些需要4个字节表示。

    NSUTF16BigEndianStringEncoding = 0x90000100, /* NSUTF16StringEncoding encoding with explicit endianness specified */

    UTF-16的大字节字节序,高位在前,地位在后。

    NSUTF16LittleEndianStringEncoding = 0x94000100, /* NSUTF16StringEncoding encoding with explicit endianness specified */

    UTF-16的小字节字节序,低位在前,高位在后。

    NSUTF32StringEncoding = 0x8c000100,

    固定使用4个字节表示文字。

    NSUTF32BigEndianStringEncoding = 0x98000100, /* NSUTF32StringEncoding encoding with explicit endianness specified */

    UTF-32的大字节字节序,高位在前,地位在后。

    NSUTF32LittleEndianStringEncoding = 0x9c000100 /* NSUTF32StringEncoding encoding with explicit endianness specified */

    UTF-32的小字节字节序,低位在前,高位在后。

    测试不同编码的代码

    当解码的时候使用与编码一样的格式,那么都可以正常的解析。如果采用的普通的数字和字母,那么不同的解码方式也可以得到正常的结果。

    - (void)testStringEncoding
    {
    //    NSStringEncoding
    
        NSString *str = @"1234567890";
        NSData *data = [str dataUsingEncoding:NSASCIIStringEncoding];
    
        NSString *strEncoding1 = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
        NSString *strEncoding2 = [[NSString alloc] initWithData:data encoding:NSNEXTSTEPStringEncoding];
        NSString *strEncoding3 = [[NSString alloc] initWithData:data encoding:NSJapaneseEUCStringEncoding];
        NSString *strEncoding4 = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSString *strEncoding5 = [[NSString alloc] initWithData:data encoding:NSISOLatin1StringEncoding];
        NSString *strEncoding6 = [[NSString alloc] initWithData:data encoding:NSSymbolStringEncoding];
        NSString *strEncoding7 = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding];
        NSString *strEncoding8 = [[NSString alloc] initWithData:data encoding:NSShiftJISStringEncoding];
        NSString *strEncoding9 = [[NSString alloc] initWithData:data encoding:NSISOLatin2StringEncoding];
        NSString *strEncoding10 = [[NSString alloc] initWithData:data encoding:NSUnicodeStringEncoding];
        NSString *strEncoding11 = [[NSString alloc] initWithData:data encoding:NSWindowsCP1251StringEncoding];
        NSString *strEncoding12 = [[NSString alloc] initWithData:data encoding:NSISO2022JPStringEncoding];
        NSString *strEncoding13 = [[NSString alloc] initWithData:data encoding:NSMacOSRomanStringEncoding];
        NSString *strEncoding14 = [[NSString alloc] initWithData:data encoding:NSUTF16StringEncoding];
        NSString *strEncoding15 = [[NSString alloc] initWithData:data encoding:NSUTF16BigEndianStringEncoding];
        NSString *strEncoding16 = [[NSString alloc] initWithData:data encoding:NSUTF16LittleEndianStringEncoding];
        NSString *strEncoding17 = [[NSString alloc] initWithData:data encoding:NSUTF32StringEncoding];
        NSString *strEncoding18 = [[NSString alloc] initWithData:data encoding:NSUTF32BigEndianStringEncoding];
        NSString *strEncoding19 = [[NSString alloc] initWithData:data encoding:NSUTF32LittleEndianStringEncoding];
    
        NSLog(@"WOW");
    }
    

    总结

    学习了所有的编码格式后,Unicode才是王道,其他的小众编码已经不再使用了。使用UTF-8,UTF-16使用的是最多的。在iOS开发的过程中,使用UTF-8是最多的。

    stringByTrimmingCharactersInSet使用

    - (NSString *)stringByTrim {
        NSCharacterSet *set = [NSCharacterSet whitespaceAndNewlineCharacterSet];
        return [self stringByTrimmingCharactersInSet:set];
    }
    

    返回一个将两头的空格和所有的换行符去除的新字符串。


    使用了NSCharacterSet的使用:

    @property (readonly, class, copy) NSCharacterSet *controlCharacterSet;
    

    一种字符集,包含Unicode一般类别Cc和Cf的字符.
    Cc 为控制: 指示字符是控制代码,其 Unicode 值是 U+007F,或者位于 U+0000 到 U+001F 或 U+0080 到 U+009F 范围内。
    Cf 为格式:指示字符是格式字符,格式字符是通常不呈现的字符,但它影响文本布局或文本处理操作。

    U+007F 为删除符号。

    @property (readonly, class, copy) NSCharacterSet *whitespaceCharacterSet;
    

    包含Unicode通用Zs和字符列表(U+0009),不包含新行或回车符。

    Zs为空白字符,不具有标志符号,但不是控制或格式字符。

    @property (readonly, class, copy) NSCharacterSet *whitespaceAndNewlineCharacterSet;
    

    包含了Unicode的U+000A到U+000D和U+0085。

    • U+000A 换行
    • U+000B 垂直制表
    • U+000C 换页
    • U+000D 回车
    • U+0085 下一行
    @property (readonly, class, copy) NSCharacterSet *decimalDigitCharacterSet;
    

    包含十进制数字,即在范围0到9内。

    @property (readonly, class, copy) NSCharacterSet *letterCharacterSet;
    

    包含Unicode分类的L和M的所有字符。通常包含了所有的字母和象形文字。

    • Lu UppercaseLetter 大写字母
    • LI LowercaseLetter 小写字母
    • Lt TitlecaseLetter 词首字母大写字母
    • Lm ModifierLetter 修饰符字母。它是独立式的间距字符,指示前面字母的修改。
    • Lo OtherLetter 字母。 它不是大写字母,小写字母,词首字母大学或修饰符字母。
    • Mn NonSpacingMark 非间距字母。它是基字符的修改。
    • Mc SpacingCombiningMark 间距字符。 它是基字符的修改并影响该基字符的标志符号的宽度。
    • Me EnclosingMark 封闭符号。它是非间距组合字符,环绕直到基字符(并包含基字符)的所有前面的字符。
    @property (readonly, class, copy) NSCharacterSet *lowercaseLetterCharacterSet;
    

    包含Unicode分类的LI。通常包含所有小写的字母和象形文字。

    @property (readonly, class, copy) NSCharacterSet *uppercaseLetterCharacterSet;
    

    包含Unicode分类的Lu和Lt。通常包含所有大写的字母和象形文字。

    @property (readonly, class, copy) NSCharacterSet *nonBaseCharacterSet;
    

    包含Unicode分类的M*。

    @property (readonly, class, copy) NSCharacterSet *alphanumericCharacterSet;
    

    包含Unicode分类的L,M和N*。

    • Nd DecimalDigitNumber 十进制数字。 范围0到9内。
    • NI LetterNumber 字母表示的数字,而不是十进制的数字,例如,罗马数字5由字母“V”表示。
    • No OtherNumber 数字。它不是十进制数字也不是字母数字,例如分数1/2.
    @property (readonly, class, copy) NSCharacterSet *decomposableCharacterSet;
    

    在Unicode字符编码标准3.2版本中,包含能够代表字符序列组成的个别Unicode字符(例如口语字母),定义为标准分解。
    这些字符兼容预组成字符。
    注意在Unicode标准版本2.0中,不包含这些字符。

    @property (readonly, class, copy) NSCharacterSet *illegalCharacterSet;
    

    包含在分类Non-Characters中,或还没有在Unicode标准版本3.2中定义。包含所有非法字符。

    @property (readonly, class, copy) NSCharacterSet *punctuationCharacterSet;
    

    包含Unicode分类P*。

    • Pc ConnectorPunctuation 连接两个字符的连接符标点。
    • Pd DashPunctuation 短划线或连字符。
    • Ps OpenPunctuation 成对的标点符号(例如括号,方括号和大括号)之一的开始字符。
    • Pe ClosePunctuation 成对的标点符号(例如括号,方括号和大括号)之一的封闭字符。
    • Pi InitialQuotePunctuation 开始或前引号。
    • Pf FinalQuotePunctuation 封闭或后引号。
    • Po OtherPunctuation 标点。(以上的除外)
    @property (readonly, class, copy) NSCharacterSet *capitalizedLetterCharacterSet;
    

    包含Unicode分类Lt。

    @property (readonly, class, copy) NSCharacterSet *symbolCharacterSet;
    

    包含Unicode分类S*.

    • Sm MathSymbol 数学符号,例如“+”或“=”
    • Sc CurrencySymbol 货币符号。
    • Sk ModifierSymbol 修饰符符号,指示环绕字符的修改。例如,分数斜线号指示其左侧的数字为分子,右侧的数字为分母。
    • So OtherSymbol 符号。(以上的除外)
    @property (readonly, class, copy) NSCharacterSet *newlineCharacterSet
    

    包含新行的字符(U+000A~U+000D, U+0085, U+2028, U+2029),所有的新行字符。

    • U+000A 换行
    • U+000B 垂直制表
    • U+000C 换页
    • U+000D 回车
    • U+0085 下一行
    • U+2028 行分隔符
    • U+2029 章节分隔符

    参考文章:

    // END 发现这个文章有点长了。 String真的是包含太多的内容了,之前了解的只是皮毛啊。

    相关文章

      网友评论

          本文标题:NSString+YYAdd的学习

          本文链接:https://www.haomeiwen.com/subject/jnsxpxtx.html