ios提供了许多初始化函数。可以从字符数组初始化,从C语言字符串初始化,从文件初始化,从网络地址初始化……初始化操作主要功能是将不同编码的字符串转化为unicode编码的字符串。
以下为最基本的4个初始化函数
- (instancetype)initWithCharacters:(const unichar *)characters length:(NSUInteger)length;
根据unicode字符序列初始化字符串
参数characters是unicode字符序列,参数length是字符序列的长度
- (instancetype)initWithCharactersNoCopy:(unichar *)characters length:(NSUInteger)length
freeWhenDone:(BOOL)freeBuffer;
/* "NoCopy" is a hint */
根据unicode字符序列初始化字符串
参数characters是unicode字符序列,参数length是字符序列的长度,参数freeBuffer表示在初始化完成后是否释放字符序列占用的内存。内存释放后不能再使用。
- (nullable instancetype)initWithBytes:(const void *)bytes length:(NSUInteger)len
encoding:(NSStringEncoding)encoding;
根据字符序列初始化字符串
参数bytes是字符序列,参数len是字符序列的长度,参数encoding是字符序列的编码方式。
initWithBytes解码bytes字符序列获取unicode字符序列,若解码失败则返回nil。
- (nullable instancetype)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)len
encoding:(NSStringEncoding)encoding freeWhenDone:(BOOL)freeBuffer;
根据字符序列初始化字符串
参数bytes是字符序列,参数len是字符序列的长度,参数encoding是字符序列的编码方式,参数freeBuffer表示在初始化完成后是否释放字符序列占用的内存。内存释放后不能再使用。
initWithBytesNoCopy解码bytes字符序列获取unicode字符序列,若解码失败则返回nil。
ios支持的编码格式有
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,
/* 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,
/* An alias for NSUnicodeStringEncoding */
NSUTF16BigEndianStringEncoding = 0x90000100,
/* NSUTF16StringEncoding encoding with explicit endianness specified */
NSUTF16LittleEndianStringEncoding = 0x94000100,
/* NSUTF16StringEncoding encoding with explicit endianness specified */
NSUTF32StringEncoding = 0x8c000100,
/* NSUTF32StringEncoding encoding with explicit endianness specified */
NSUTF32LittleEndianStringEncoding = 0x9c000100
/* NSUTF32StringEncoding encoding with explicit endianness specified */
};
实例
char *buf=(char *)malloc(18);
buf[0]=0xe4;
buf[1]=0xbd;
buf[2]=0xa0;
buf[3]=0xe5;
buf[4]=0xa5;
buf[5]=0xbd;
buf[6]=0xef;
buf[7]=0xbc;
buf[8]=0x8c;
buf[9]=0xe4;
buf[10]=0xb8;
buf[11]=0x96;
buf[12]=0xe7;
buf[13]=0x95;
buf[14]=0x8c;
buf[15]=0xef;
buf[16]=0xbc;
buf[17]=0x81;
NSString *str1=[[NSString alloc] initWithBytesNoCopy:buf length:18 encoding:NSUTF8StringEncoding freeWhenDone:NO];
NSString *str2=[[NSString alloc] initWithBytes:buf length:18 encoding:NSUTF8StringEncoding];
NSLog(@"str = %@",str1);
NSLog(@"str = %@",str2);
unichar *buf2=(unichar *)malloc(6*sizeof(unichar));
buf2[0]=0x4f60;
buf2[1]=0x597d;
buf2[2]=0xff0c;
buf2[3]=0x4e16;
buf2[4]=0x754c;
buf2[5]=0xff01;
NSString *str3=[[NSString alloc] initWithCharactersNoCopy:buf2 length:6*sizeof(unichar) freeWhenDone:NO];
NSString *str4=[[NSString alloc] initWithCharacters:buf2 length:6*sizeof(unichar)];
NSLog(@"str = %@",str3);
NSLog(@"str = %@",str4);
输出
2017-03-14 04:54:28.322 objc-base[1853:310923] str = 你好,世界!
2017-03-14 04:54:28.324 objc-base[1853:310923] str = 你好,世界!
2017-03-14 04:54:28.325 objc-base[1853:310923] str = 你好,世界!
2017-03-14 04:54:28.326 objc-base[1853:310923] str = 你好,世界!
以下是其他初始化函数
- (nullable instancetype)initWithUTF8String:(const char *)nullTerminatedCString;
等同于initWithBytes,只是字符序列改为UTF8字符序列
- (nullable instancetype)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding;
等同于initWithBytes,只是字符序列由NSData提供
- (nullable instancetype)initWithCString:(const char *)nullTerminatedCString
encoding:(NSStringEncoding)encoding;
等同于initWithBytes,只是字符序列由C字符串提供
- (nullable id)initWithCString:(const char *)bytes
- (nullable id)initWithCString:(const char *)bytes length:(NSUInteger)length
由C字符串初始化,使用默认的编码
- (nullable id)initWithCStringNoCopy:(char *)bytes length:(NSUInteger)length
freeWhenDone:(BOOL)freeBuffer
由C字符串初始化,使用默认的编码
@property (class, readonly) NSStringEncoding defaultCStringEncoding;
defaultCStringEncoding方法可以输出默认的编码
NSStringEncoding encode=[NSString defaultCStringEncoding];
NSLog(@"encode = %lu ",encode);
输出
2017-03-14 05:22:24.085 objc-base[1888:327744] encode = 30
- (instancetype)initWithString:(NSString *)aString;
根据字符串初始化字符串
- (instancetype)initWithFormat:(NSString *)format, ...
- (instancetype)initWithFormat:(NSString *)format arguments:(va_list)argList
- (instancetype)initWithFormat:(NSString *)format locale:(nullable id)locale, ...
- (instancetype)initWithFormat:(NSString *)format locale:(nullable id)locale
arguments:(va_list)argList
根据格式化字符串初始化字符串
- (nullable id)initWithContentsOfFile:(NSString *)path
- (nullable instancetype)initWithContentsOfFile:(NSString *)path
encoding:(NSStringEncoding)enc error:(NSError **)error;
根据文件内容初始化字符串
参数path指定文件路径,enc指定文件编码格式,error在操作出错时表示出错信息。
- (nullable instancetype)initWithContentsOfFile:(NSString *)path
usedEncoding:(nullable NSStringEncoding *)enc error:(NSError **)error;
根据文件内容初始化字符串
参数path指定文件路径,enc用于获取文件编码格式,error在操作出错时表示出错信息。
- (nullable id)initWithContentsOfURL:(NSURL *)url
- (nullable instancetype)initWithContentsOfURL:(NSURL *)url
encoding:(NSStringEncoding)enc error:(NSError **)error;
根据url内容初始化字符串
参数url指定url路径,enc指定编码格式,error在操作出错时表示出错信息。
- (nullable instancetype)initWithContentsOfURL:(NSURL *)url
usedEncoding:(nullable NSStringEncoding *)enc error:(NSError **)error;
根据url内容初始化字符串
参数url指定url路径,enc获取编码格式,error在操作出错时表示出错信息。
ios提供了许多构建字符串的函数。
+ (instancetype)stringWithCharacters:(const unichar *)characters length:(NSUInteger)length;
由unicode字符序列构建字符串。
+ (nullable instancetype)stringWithUTF8String:(const char *)nullTerminatedCString;
由UTF8字符序列构建字符串。
+ (nullable instancetype)stringWithCString:(const char *)cString
encoding:(NSStringEncoding)enc;
由C语言字符串构建字符串。
+ (nullable id)stringWithCString:(const char *)bytes
+ (nullable id)stringWithCString:(const char *)bytes length:(NSUInteger)length
由C语言字符串使用默认编码构建字符串。
+ (instancetype)stringWithString:(NSString *)string;
由字符串构建字符串。
+ (instancetype)string;
构建字符串。
+ (instancetype)stringWithFormat:(NSString *)format, ...
+ (instancetype)localizedStringWithFormat:(NSString *)format, ...
由格式化字符串构建字符串。
+ (nullable id)stringWithContentsOfFile:(NSString *)path;
+ (nullable instancetype)stringWithContentsOfFile:(NSString *)path
encoding:(NSStringEncoding)enc error:(NSError **)error;
+ (nullable instancetype)stringWithContentsOfFile:(NSString *)path
usedEncoding:(nullable NSStringEncoding *)enc error:(NSError **)error;
由文件构建字符串。
+ (nullable id)stringWithContentsOfURL:(NSURL *)url;
+ (nullable instancetype)stringWithContentsOfURL:(NSURL *)url
encoding:(NSStringEncoding)enc error:(NSError **)error;
+ (nullable instancetype)stringWithContentsOfURL:(NSURL *)url
usedEncoding:(nullable NSStringEncoding *)enc error:(NSError **)error;
由url构建字符串。