Objective-C中使用BIG5编码向后端传输中文字符出现乱码如何解决
问题排查点
- 首先修正编码类型传参错误:
dataUsingEncoding:要求传入的是NSStringEncoding类型,你第二部分代码直接传入了CoreFoundation层的kCFStringEncodingBig5_HKSCS_1999枚举值,类型不匹配会导致编码转换失败,生成的HTTPBody本身就是错误数据。 - 避免重复编码逻辑冲突:你先将
orderDesc单独转为BIG5的NSData存入字典,后续拼接postBodyString时如果是直接将NSData强转UTF-8字符串拼接,会导致这部分内容提前乱码,后续再转BIG5也无法恢复。 - 编码标准对齐问题:你使用的是香港增补字符集版本的BIG5(
kCFStringEncodingBig5_HKSCS_1999),如果后端数据库使用的是标准BIG5,特殊字符会出现不兼容乱码,可替换为标准kCFStringEncodingBig5测试。 - 缺失URL编码步骤:
application/x-www-form-urlencoded格式要求非ASCII字符必须做百分号编码,你直接将BIG5编码的字节作为请求体传输,特殊字符会被传输层或后端错误解析。 - 后端配置校验:确认后端服务会读取
Content-Type的charset参数解析请求体,且后端与数据库的连接编码已设置为BIG5,避免后端用默认UTF-8解析请求后再转存数据库导致二次乱码。
修正后代码示例
// 统一使用标准BIG5编码,需要HKSCS的话再替换对应枚举 NSStringEncoding big5Enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingBig5); // 拼接参数时先做百分号编码 NSString *encodedOrderDesc = (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes( kCFAllocatorDefault, (__bridge CFStringRef)self.postParams.orderDesc, NULL, CFSTR("!*'();:@&=+$,/?%#[] "), kCFStringEncodingBig5 ); // 拼接完整表单字符串,其余参数也按相同规则编码后拼接 NSString *postBodyString = [NSString stringWithFormat:@"orderDesc=%@", encodedOrderDesc]; // 正确转成BIG5编码的NSData NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:self.requestURL] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:TIMEOUT_SECONDS]; request.HTTPMethod = @"POST"; request.HTTPBody = [postBodyString dataUsingEncoding:big5Enc allowLossyConversion:NO]; [request addValue:@"application/x-www-form-urlencoded; charset=big5" forHTTPHeaderField:@"Content-Type"];
内容的提问来源于stack exchange,提问作者rubie
相关产品推荐
相关产品推荐

