【环境描述】
OS X ML 10.8,Xcode4.4.1,iOS 5.1
【问题描述】
因服务器和客户端数据交互需要编码格式统一,常见的是UTF8和GB2312编码,该文档简单讲解Http通讯中的URL和Post的Body部分的数据编码格式,供后续翻阅。
【问题分析】
一、Http的URL编码
url中需要对中文以及不支持的字符进行%处理,同时可能需要UTF8与GB2312之间互转,在iOS中实现如下(从搜索中直接拷贝过来的,仅供参考):
//转换成GB2312----uif8
-(CFStringRef)EncodeUTF8Str:(NSString *)encodeStr
{
CFStringRef nonAlphaNumValidChars = CFSTR("![ DISCUZ_CODE_1 ]’()*+,-./:;=?@_~");
CFStringRef preprocessedString = CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault, (CFStringRef)encodeStr, CFSTR(""), kCFStringEncodingUTF8);
CFStringRef newStr = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,preprocessedString,NULL,nonAlphaNumValidChars,kCFStringEncodingUTF8);
return newStr;
}
//uft8-----gb2312
-(NSString *)EncodeGB2312Str:(NSString *)encodeStr
{
CFStringRef nonAlphaNumValidChars = CFSTR("![ DISCUZ_CODE_1 ]’()*+,-./:;=?@_~");
NSString *preprocessedString = (NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault, (CFStringRef)encodeStr, CFSTR(""), kCFStringEncodingGB_18030_2000);
NSString *newStr = [(NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)preprocessedString,NULL,nonAlphaNumValidChars,kCFStringEncodingGB_18030_2000) autorelease];
[preprocessedString release];
return newStr;
}
二、Post的Body编码格式
iOS默认是UTF8编码,而有的服务器未做编码自适应,要求必须传gb2312编码,实现如下:
由上层拼接Body字符串,如:NSString *body = [NSString stringWithFormat:@"{\"functiont....
然后在创建request请求时,转换成GB2312,如下:
NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
[m_pRequest setHTTPBody:[body dataUsingEncoding:encoding]];