在日常的网络请求中难免 URL 中会有汉字的内容,若不做相应的处理直接将字符串转换成 URL 来加载是有问题的,至于文字编码的基本知识请参考这里 Unicode与UTF-8互转(C语言实现),现整理下几种常用的转换方法的代码如下,另推荐一个在线转换的网页{这里传送门}。
- /// 汉字 UTF8 互转
- NSString* strA = [@"%E4%B8%AD%E5%9B%BD" stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
- NSString *strB = [@"中国" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
- NSLog(@"%@",strA); // 中国
- NSLog(@"%@",strB); // %E4%B8%AD%E5%9B%BD
- - (NSString *)replaceUnicode:(NSString *)unicodeStr {
- NSString *tempStr1 = [unicodeStr stringByReplacingOccurrencesOfString:@"\u"withString:@"\U"];
- NSString *tempStr2 = [tempStr1 stringByReplacingOccurrencesOfString:@"""withString:@"\""];
- NSString *tempStr3 = [[@"""stringByAppendingString:tempStr2]stringByAppendingString:@"""];
- NSData *tempData = [tempStr3 dataUsingEncoding:NSUTF8StringEncoding];
- NSString* returnStr = [NSPropertyListSerialization propertyListFromData:tempData
- mutabilityOption:NSPropertyListImmutable
- format:NULL
- errorDescription:NULL];
- return [returnStr stringByReplacingOccurrencesOfString:@"\r\n"withString:@" "];
- }
- /// Unicode 转汉字
- NSString *content = @"\u4e2d\u56fd";
- content = [self replaceUnicode:content];
- NSLog(@"%@",content); // 中国
应用都要遇到一个很头疼的问题:文字编码,汉字的 GBK 和 国际通用的 UTF-8 的互相转化稍一不慎,
就会满屏乱码。下面介绍 UTF-8 和 GBK 的 NSString 相互转化的方法
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
char* c_test = "北京";
int nLen = strlen(c_test);
NSString* str = [[NSString alloc]initWithBytes:c_test length:nLen encoding:enc ];
NSLog(@"str = %@",str);
从 GBK 转到 UTF-8
用 NSStringEncoding enc =CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000) ,
然后就可以用initWithData:encoding来实现。
从 UTF-8 转到 GBK
CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000),
得到的enc却是kCFStringEncodingInvalidId。
没关系,试试 NSData *data=[nsstring dataUsingEncoding:-2147482063];
转换字符编码主要用到CFStringConvertEncodingToNSStringEncoding函数,具体的大家可以看看这个函数的用法
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding (kCFStringEncodingGB_18030_2000);
完整代码如下:
NSURL *url = [NSURL URLWithString:urlStr];
NSData *data = [NSData dataWithContentsOfURL:url];
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSString *retStr = [[NSString alloc] initWithData:data encoding:enc];
一个比较方便的转换NSString为UTF8编码的函数,大家可以试试
头文件:
@interface NSString (OAURLEncodingAdditions)
- (NSString *)URLEncodedString;
- (NSString *)URLDecodedString;
@end
m文件:
@implementation
NSString (OAURLEncodingAdditions)
- (NSString *)URLEncodedString
{
NSString *result = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)self,NULL,CFSTR("!*'();:@&=+$,/?%#[]"),kCFStringEncodingUTF8);
[result autorelease];
return result;
}
- (NSString*)URLDecodedString
{
NSString *result = (NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault,(CFStringRef)self, CFSTR(""),kCFStringEncodingUTF8);CFSTR(""),kCFStringEncodingUTF8);
[result autorelease];
return result;
}
@end
如果需要转换一个NSString, 只需要
NSString *temp = [@"测试utf8" URLEncodedString];
NSString *decoded = [temp URLDecodedString];