ios开发之字符串初始化(一)

本文介绍了iOS中字符串初始化的各种方法,包括从Unicode字符序列、C语言字符串、文件和网络地址初始化。详细讲解了初始化函数的功能,特别是涉及的编码转换,并列举了多个示例,如initWithBytes系列函数,以及通过UTF8、NSData、C字符串、文件和URL来创建字符串的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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构建字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值