NSString的內(nèi)容好豐富啊骨田,學(xué)習(xí)了很久很久,也補(bǔ)充了不熟悉的內(nèi)容声怔。
算法了解
- Hash算法: 將任意長(zhǎng)度的消息壓縮到某一固定長(zhǎng)度的消息摘要的函數(shù)态贤。
- MD5: 將消息運(yùn)算為一固定的長(zhǎng)度值,保證消息的完整性捧搞。 (Hash的一種)
- HMAC: 秘鑰相關(guān)的哈希運(yùn)算消息認(rèn)證碼抵卫,以一個(gè)秘鑰和一個(gè)消息的輸入,生成一個(gè)消息摘要作為輸出胎撇。 (Hash的一種)
- CRC: 循環(huán)冗余校驗(yàn)碼介粘,一種數(shù)據(jù)傳輸檢錯(cuò)功能,對(duì)數(shù)據(jù)進(jìn)行多項(xiàng)式計(jì)算晚树,并將得到的結(jié)果附在幀的后面姻采,接受設(shè)備也執(zhí)行類似的算法,以保證數(shù)據(jù)傳輸?shù)恼_性和完整性爵憎。
- AES: 高級(jí)加密標(biāo)準(zhǔn)慨亲。
從來(lái)沒(méi)有研究過(guò)算法的具體細(xì)節(jié),直接copy一個(gè)代碼然后大功告成宝鼓。
String添加char
NSMutableString *result = [NSMutableString string];
unichar c = '2';
CFStringAppendCharacters((CFMutableStringRef)result, &c, 1);
NSString的方法真當(dāng)是多啊刑棵,很多沒(méi)有用到過(guò),也沒(méi)研究過(guò)愚铡。
金額計(jì)算使用
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);
常常碰到計(jì)算金額的時(shí)候精度問(wèn)題蛉签,最好的辦法是計(jì)算全部是服務(wù)器。如果要在本地就不要使用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編碼的字符串,強(qiáng)制轉(zhuǎn)化為其他的編碼類型時(shí)邑雅,除了NSUnicodeStringEncoding片橡,NSUTF16StringEncoding,NSUTF16BigEndianStringEncoding淮野,NSUTF16LittleEndianStringEncoding捧书,NSUTF32StringEncoding,NSUTF32BigEndianStringEncoding骤星,NSUTF32LittleEndianStringEncoding返回為亂碼或空外鳄厌,其他的編碼類型返回正常。
NSNEXTSTEPStringEncoding = 2,
8bit的ASCII碼的NEXTSTEP擴(kuò)展妈踊。
NEXTSTEP是喬布斯創(chuàng)立的公司了嚎,后來(lái)被蘋果公司收購(gòu)。應(yīng)該是為了兼容才添加了這個(gè)類型廊营。
NSJapaneseEUCStringEncoding = 3,
8bit的EUC編碼歪泳,為日本文字提供兼容的一個(gè)編碼格式。
NSUTF8StringEncoding = 4,
Unicode的一種實(shí)現(xiàn)方案露筒,8不是指使用8位來(lái)標(biāo)識(shí)文字呐伞,而是使用可變字節(jié),最多4個(gè)字節(jié)慎式。特點(diǎn)是:不同范圍的字符使用不同長(zhǎng)度的編碼伶氢。
編碼規(guī)則:
Unicode編碼(16進(jìn)制) ║ UTF-8 字節(jié)流(二進(jìn)制)
000000 - 00007F ║ 0xxxxxxx
000080 - 0007FF ║ 110xxxxx 10xxxxxx
000800 - 00FFFF ║ 1110xxxx 10xxxxxx 10xxxxxx
010000 - 10FFFF ║ 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
編碼格式的檢測(cè):字節(jié)序標(biāo)志頭(文件前面的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的國(guó)際標(biāo)準(zhǔn)的拉丁文編碼。
NSSymbolStringEncoding = 6,
8bit的Adobe符號(hào)編碼矢量癣防。
NSNonLossyASCIIStringEncoding = 7,
7bit的冗長(zhǎng)ASCII碼表示所有的Unicode字符蜗巧。
NSShiftJISStringEncoding = 8, /* kCFStringEncodingDOSJapanese */
為日本文字提供兼容的,8bit的Shift-JIS編碼蕾盯。
Shift-JIS是日本電腦系統(tǒng)最常用的編碼表幕屹。
NSISOLatin2StringEncoding = 9,
8bit的國(guó)際標(biāo)準(zhǔn)的拉丁文2編碼。
NSUnicodeStringEncoding = 10,
字符串對(duì)象的標(biāo)準(zhǔn)的Unicode編碼级遭。
NSWindowsCP1251StringEncoding = 11, /* Cyrillic; same as AdobeStandardCyrillic */
Windows系統(tǒng)的代碼頁(yè)1251望拖,斯拉夫字母的字符編碼。與AdobeStandardCyrillic字體編碼等價(jià)挫鸽。
CodePage(代碼頁(yè))说敏,因?yàn)锳NSI編碼在每個(gè)國(guó)家都不統(tǒng)一,不兼容丢郊,可能導(dǎo)致沖突像云,所以在處理文字的時(shí)候,必須要告訴計(jì)算機(jī)你的ANSI是哪個(gè)國(guó)家和地圖的標(biāo)準(zhǔn)蚂夕,這個(gè)就叫代碼頁(yè)迅诬。
NSWindowsCP1252StringEncoding = 12, /* WinLatin1 */
Windows系統(tǒng)的代碼頁(yè)1252,等價(jià)于WinLatin1編碼婿牍。
NSWindowsCP1253StringEncoding = 13, /* Greek */
Windows系統(tǒng)的代碼頁(yè)1253侈贷,Greek字符編碼。
NSWindowsCP1254StringEncoding = 14, /* Turkish */
Windows系統(tǒng)的代碼頁(yè)1253等脂,Turkish字符編碼俏蛮。
NSWindowsCP1250StringEncoding = 15, /* WinLatin2 */
Windows系統(tǒng)的代碼頁(yè)1250,等價(jià)于WinLatin2編碼上遥。
NSISO2022JPStringEncoding = 21, /* ISO 2022 Japanese encoding for e-mail */
國(guó)際標(biāo)準(zhǔn)2022的日本電子郵件編碼搏屑。
NSMacOSRomanStringEncoding = 30,
經(jīng)典的Macintosh羅馬編碼。
Macintosh是蘋果公司生產(chǎn)的一種型號(hào)的計(jì)算機(jī)粉楚。
NSUTF16StringEncoding = NSUnicodeStringEncoding, /* An alias for NSUnicodeStringEncoding */
以16位無(wú)符號(hào)整數(shù)為單位辣恋。注意16位為一個(gè)單位,不表示一個(gè)字符就只有16位模软。絕大部分2個(gè)字節(jié)伟骨,有些需要4個(gè)字節(jié)表示。
NSUTF16BigEndianStringEncoding = 0x90000100, /* NSUTF16StringEncoding encoding with explicit endianness specified */
UTF-16的大字節(jié)字節(jié)序燃异,高位在前携狭,地位在后。
NSUTF16LittleEndianStringEncoding = 0x94000100, /* NSUTF16StringEncoding encoding with explicit endianness specified */
UTF-16的小字節(jié)字節(jié)序回俐,低位在前逛腿,高位在后稀并。
NSUTF32StringEncoding = 0x8c000100,
固定使用4個(gè)字節(jié)表示文字。
NSUTF32BigEndianStringEncoding = 0x98000100, /* NSUTF32StringEncoding encoding with explicit endianness specified */
UTF-32的大字節(jié)字節(jié)序单默,高位在前碘举,地位在后。
NSUTF32LittleEndianStringEncoding = 0x9c000100 /* NSUTF32StringEncoding encoding with explicit endianness specified */
UTF-32的小字節(jié)字節(jié)序雕凹,低位在前殴俱,高位在后政冻。
測(cè)試不同編碼的代碼
當(dāng)解碼的時(shí)候使用與編碼一樣的格式枚抵,那么都可以正常的解析。如果采用的普通的數(shù)字和字母明场,那么不同的解碼方式也可以得到正常的結(jié)果汽摹。
- (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");
}
總結(jié)
學(xué)習(xí)了所有的編碼格式后,Unicode才是王道苦锨,其他的小眾編碼已經(jīng)不再使用了逼泣。使用UTF-8,UTF-16使用的是最多的舟舒。在iOS開(kāi)發(fā)的過(guò)程中拉庶,使用UTF-8是最多的。
stringByTrimmingCharactersInSet使用
- (NSString *)stringByTrim {
NSCharacterSet *set = [NSCharacterSet whitespaceAndNewlineCharacterSet];
return [self stringByTrimmingCharactersInSet:set];
}
返回一個(gè)將兩頭的空格和所有的換行符去除的新字符串秃励。
使用了NSCharacterSet的使用:
@property (readonly, class, copy) NSCharacterSet *controlCharacterSet;
一種字符集氏仗,包含Unicode一般類別Cc和Cf的字符.
Cc 為控制: 指示字符是控制代碼,其 Unicode 值是 U+007F夺鲜,或者位于 U+0000 到 U+001F 或 U+0080 到 U+009F 范圍內(nèi)皆尔。
Cf 為格式:指示字符是格式字符,格式字符是通常不呈現(xiàn)的字符币励,但它影響文本布局或文本處理操作慷蠕。
U+007F 為刪除符號(hào)。
@property (readonly, class, copy) NSCharacterSet *whitespaceCharacterSet;
包含Unicode通用Zs和字符列表(U+0009)食呻,不包含新行或回車符流炕。
Zs為空白字符,不具有標(biāo)志符號(hào)仅胞,但不是控制或格式字符浪感。
@property (readonly, class, copy) NSCharacterSet *whitespaceAndNewlineCharacterSet;
包含了Unicode的U+000A到U+000D和U+0085。
- U+000A 換行
- U+000B 垂直制表
- U+000C 換頁(yè)
- U+000D 回車
- U+0085 下一行
@property (readonly, class, copy) NSCharacterSet *decimalDigitCharacterSet;
包含十進(jìn)制數(shù)字饼问,即在范圍0到9內(nèi)影兽。
@property (readonly, class, copy) NSCharacterSet *letterCharacterSet;
包含Unicode分類的L和M的所有字符。通常包含了所有的字母和象形文字莱革。
- Lu UppercaseLetter 大寫字母
- LI LowercaseLetter 小寫字母
- Lt TitlecaseLetter 詞首字母大寫字母
- Lm ModifierLetter 修飾符字母峻堰。它是獨(dú)立式的間距字符讹开,指示前面字母的修改。
- Lo OtherLetter 字母捐名。 它不是大寫字母旦万,小寫字母,詞首字母大學(xué)或修飾符字母镶蹋。
- Mn NonSpacingMark 非間距字母成艘。它是基字符的修改。
- Mc SpacingCombiningMark 間距字符贺归。 它是基字符的修改并影響該基字符的標(biāo)志符號(hào)的寬度淆两。
- Me EnclosingMark 封閉符號(hào)。它是非間距組合字符拂酣,環(huán)繞直到基字符(并包含基字符)的所有前面的字符秋冰。
@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 十進(jìn)制數(shù)字饺谬。 范圍0到9內(nèi)捂刺。
- NI LetterNumber 字母表示的數(shù)字,而不是十進(jìn)制的數(shù)字商蕴,例如叠萍,羅馬數(shù)字5由字母“V”表示。
- No OtherNumber 數(shù)字绪商。它不是十進(jìn)制數(shù)字也不是字母數(shù)字苛谷,例如分?jǐn)?shù)1/2.
@property (readonly, class, copy) NSCharacterSet *decomposableCharacterSet;
在Unicode字符編碼標(biāo)準(zhǔn)3.2版本中,包含能夠代表字符序列組成的個(gè)別Unicode字符(例如口語(yǔ)字母)格郁,定義為標(biāo)準(zhǔn)分解腹殿。
這些字符兼容預(yù)組成字符。
注意在Unicode標(biāo)準(zhǔn)版本2.0中例书,不包含這些字符锣尉。
@property (readonly, class, copy) NSCharacterSet *illegalCharacterSet;
包含在分類Non-Characters中,或還沒(méi)有在Unicode標(biāo)準(zhǔn)版本3.2中定義决采。包含所有非法字符自沧。
@property (readonly, class, copy) NSCharacterSet *punctuationCharacterSet;
包含Unicode分類P*。
- Pc ConnectorPunctuation 連接兩個(gè)字符的連接符標(biāo)點(diǎn)。
- Pd DashPunctuation 短劃線或連字符拇厢。
- Ps OpenPunctuation 成對(duì)的標(biāo)點(diǎn)符號(hào)(例如括號(hào)爱谁,方括號(hào)和大括號(hào))之一的開(kāi)始字符。
- Pe ClosePunctuation 成對(duì)的標(biāo)點(diǎn)符號(hào)(例如括號(hào)孝偎,方括號(hào)和大括號(hào))之一的封閉字符访敌。
- Pi InitialQuotePunctuation 開(kāi)始或前引號(hào)。
- Pf FinalQuotePunctuation 封閉或后引號(hào)衣盾。
- Po OtherPunctuation 標(biāo)點(diǎn)寺旺。(以上的除外)
@property (readonly, class, copy) NSCharacterSet *capitalizedLetterCharacterSet;
包含Unicode分類Lt。
@property (readonly, class, copy) NSCharacterSet *symbolCharacterSet;
包含Unicode分類S*.
- Sm MathSymbol 數(shù)學(xué)符號(hào)势决,例如“+”或“=”
- Sc CurrencySymbol 貨幣符號(hào)阻塑。
- Sk ModifierSymbol 修飾符符號(hào),指示環(huán)繞字符的修改徽龟。例如叮姑,分?jǐn)?shù)斜線號(hào)指示其左側(cè)的數(shù)字為分子唉地,右側(cè)的數(shù)字為分母据悔。
- So OtherSymbol 符號(hào)。(以上的除外)
@property (readonly, class, copy) NSCharacterSet *newlineCharacterSet
包含新行的字符(U+000A~U+000D耘沼, U+0085极颓, U+2028, U+2029)群嗤,所有的新行字符菠隆。
- U+000A 換行
- U+000B 垂直制表
- U+000C 換頁(yè)
- U+000D 回車
- U+0085 下一行
- U+2028 行分隔符
- U+2029 章節(jié)分隔符
參考文章:
// END 發(fā)現(xiàn)這個(gè)文章有點(diǎn)長(zhǎng)了。 String真的是包含太多的內(nèi)容了狂秘,之前了解的只是皮毛啊骇径。