ios开发之字符串转码(二)

来源:互联网 发布:幸运飞艇全天计划数据 编辑:程序博客网 时间:2024/05/16 15:48

iOS支持多种字符编码,可以将unicode字符转码为其他编码的字符。

编码列表

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,    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,                   /* NSUTF32StringEncoding encoding with explicit endianness specified */   NSUTF32LittleEndianStringEncoding = 0x9c000100            /* NSUTF32StringEncoding encoding with explicit endianness specified */};

返回编码的名字

+(NSString *)localizedNameOfStringEncoding:(NSStringEncoding)encoding;
NSLog(@"encode = %@",[NSString localizedNameOfStringEncoding:NSASCIIStringEncoding]);NSLog(@"encode = %@",[NSString localizedNameOfStringEncoding:NSNEXTSTEPStringEncoding]);NSLog(@"encode = %@",[NSString localizedNameOfStringEncoding:NSJapaneseEUCStringEncoding]);NSLog(@"encode = %@",[NSString localizedNameOfStringEncoding:NSUTF8StringEncoding]);NSLog(@"encode = %@",[NSString localizedNameOfStringEncoding:NSISOLatin1StringEncoding]);

输出

2017-03-22 05:20:55.394 objc-base[3675:649138] encode = 2017-03-22 05:20:55.396 objc-base[3675:649138] encode = 2017-03-22 05:20:55.397 objc-base[3675:649138] encode = 2017-03-22 05:20:55.408 objc-base[3675:649138] encode = Unicode (UTF-8)2017-03-22 05:20:55.409 objc-base[3675:649138] encode = 

c字符串默认的编码

@property (class, readonly) NSStringEncoding defaultCStringEncoding;

最快的编码方式

@property (readonly) NSStringEncoding fastestEncoding;

最小的编码方式

@property (readonly) NSStringEncoding smallestEncoding;
NSLog(@"%lu",[@"a" fastestEncoding]);NSLog(@"%lu",[@"a" smallestEncoding]);

输出

2017-03-22 05:30:44.901 objc-base[3719:655769] 12017-03-22 05:30:44.903 objc-base[3719:655769] 1

支持的编码

@property (class, readonly) const NSStringEncoding *availableStringEncodings;

编码转换

转码为NSData

- (nullable NSData *)dataUsingEncoding:(NSStringEncoding)encoding allowLossyConversion:(BOOL)lossy;

参数encoding指定编码方式,参数lossy表示是否允许有损转换。

- (nullable NSData *)dataUsingEncoding:(NSStringEncoding)encoding;

参数encoding指定编码方式。

NSString *str=@"你好,世界!";NSData *data=[str dataUsingEncoding:NSWindowsCP1250StringEncoding allowLossyConversion:NO];NSLog(@"data = %@",data);data=[str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];NSLog(@"data = %@",data);data=[str dataUsingEncoding:NSUTF16StringEncoding allowLossyConversion:NO];NSLog(@"data = %@",data);

输出

2017-03-22 03:43:34.530 objc-base[3527:592251] data = (null)2017-03-22 03:43:34.533 objc-base[3527:592251] data = <e4bda0e5 a5bdefbc 8ce4b896 e7958cef bc81>2017-03-22 03:43:34.534 objc-base[3527:592251] data = <fffe604f 7d590cff 164e4c75 01ff>

转码为c字符串

- (nullable const char *)cStringUsingEncoding:(NSStringEncoding)encoding

参数encoding指定编码。
返回类型为const char *,不是obj-c的对象,但是它也是自动释放的。因为cStringUsingEncoding方法首先将字符串转换为NSData类型,然后返回调用bytes方法返回const char *。由于NSData对象是自动释放的,所以const char *也是自动释放的。下文返回类型为const char *的同理。

@property (readonly) const void *bytes

转码为utf8字符串

@property (nullable, readonly) const char *UTF8String;

转码后字符串的长度

- (NSUInteger)lengthOfBytesUsingEncoding:(NSStringEncoding)enc;

参数enc指定编码

字符串编码后最大长度

- (NSUInteger)maximumLengthOfBytesUsingEncoding:(NSStringEncoding)enc;

是否能够转码

- (BOOL)canBeConvertedToEncoding:(NSStringEncoding)encoding;

获取c字符串

- (BOOL)getCString:(char *)buffer maxLength:(NSUInteger)maxBufferCount encoding:(NSStringEncoding)encoding;

将字符串转码为字节序列并放入缓冲区中,若转码出错返回NO,若缓冲区长度小于或等于字节序列长度返回NO,否则返回YES。
参数buffer 指定缓冲区,参数maxBufferCount 指定缓冲区最大长度,参数encoding指定编码。

获取字节序列

- (BOOL)getBytes:(nullable void *)buffer maxLength:(NSUInteger)maxBufferCount usedLength:(nullable NSUInteger *)usedBufferCount encoding:(NSStringEncoding)encoding options:(NSStringEncodingConversionOptions)options range:(NSRange)range remainingRange:(nullable NSRangePointer)leftover;

以下方法不推荐使用

转码为c字符串–使用默认编码

- (nullable const char *)cString

转码为c字符串–使用默认编码–允许有损转换

- (nullable const char *)lossyCString

转码为c字符串的长度–使用默认编码

- (NSUInteger)cStringLength

获取c字符串

- (void)getCString:(char *)bytes maxLength:(NSUInteger)maxLength range:(NSRange)aRange remainingRange:(nullable NSRangePointer)leftoverRange
- (void)getCString:(char *)bytes maxLength:(NSUInteger)maxLength
- (void)getCString:(char *)bytes
0 0
原创粉丝点击