在网络开发中, 如果请求的url包含中文 空格等一些特殊的字符, url必须进行转义后才能请求成功。
NSString *urlString = [NSString stringWithFormat:@"http://www.xxxx.com/?param=%@",@"中文"];如果直接用这个url去请求会报错,需要先转义,NSString提供方法
stringByAddingPercentEscapesUsingEncoding: 编码 stringByReplacingPercentEscapesUsingEncoding: 解码
urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:urlString];这种问题,记得是刚开始工作的时候处理过,不管什么压缩库文件,基本处理方法一致。
//解压 //NSString * strPath = [NSString stringWithCString:filename]; NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); NSString * strPath = [NSString stringWithCString:filename encoding:enc]; //压缩 //新的文件名指定下面的编码格式 (constchar*) [newname cStringUsingEncoding:CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000)]网上搜索到的,基本上都是上面的解决方案。 但是我在加上这段代码后,只能解决部分的乱码问题,测试的MM通过各种网站和工具用中文生成了6个二维码,加上这段代码后仍然只能识别其中一个。后来稍微查了下二维码,常用的QR码是日本人发明的,NSShiftJISStringEncoding这个是日本用的编码格式;我猜想二维码已经普及到多个国家了,各个网站用的编码未必是开始的NSShiftJISStringEncoding编码,于是我想到了常用的ISO-8859-1编码,对应iOS的编码是NSISOLatin1StringEncoding;
//最经典的是这个 后来吴奕恒又提出了这个问题 终于全面的解决了
NSString *tempStr; //修正扫描出来二维码里有中文时为乱码问题 if ([text canBeConvertedToEncoding:NSShiftJISStringEncoding]) { tempStr = [NSString stringWithCString:[text cStringUsingEncoding:NSShiftJISStringEncoding] encoding:NSUTF8StringEncoding]; //如果转化成utf-8失败,再尝试转化为gbk if (tempStr == nil) { tempStr = [NSString stringWithCString:[text cStringUsingEncoding:NSShiftJISStringEncoding] encoding:CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000)]; } } else if([text canBeConvertedToEncoding:NSISOLatin1StringEncoding]) { tempStr = [NSString stringWithCString:[text cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding]; //如果转化成utf-8失败,再尝试转化为gbk if (tempStr == nil) { tempStr = [NSString stringWithCString:[text cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000)]; } } //如果转化都失败,就显示原始扫描出来的字符串 if (tempStr == nil) { tempStr = text; }修改后,6个二维码全部扫描识别正常。
结果cString打印出来是乱码 char类型的C字符串中文在Mac系统下打印出来显示乱码,这种乱码并不是错误,是ASCII解码所导致的。