You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 14:06:04