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] 1
2017-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