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 章节分隔符
参考文章:
- 彻底搞懂字符编码
- Unicode字符类
// END 发现这个文章有点长了。 String真的是包含太多的内容了,之前了解的只是皮毛啊。