最近做的一个项目中有用到二维码扫描, 但在测试过程中发现用 GBK编码带中文的数据生成二维码后, 扫描不来的结果是一段乱码, 对于这种情况一般有以下两种解决方案;
- 让后台更改生成二维码的编码, 不要用 GBK 进行编码, 但这种方式存在局限性, 只适用于扫描后台给出的特定二维码, 但在大多数的时候, 我们无法知晓自己扫描的二维码是以何种格式进行编码的, 所以在这个时候就需要我们客户端在对扫描的结果进行处理.
- 对扫描的结果进行处理, 下面的一点段代码我在 iOS 中对这种 GBK 编码的而导致扫描不出结果的字符串进行的处理, 原理是: NSString 一开始把一段 GBK 编码的字节流逐个字节地按照 8bit处理了,原本 8 个字节对应的是 5 个字符,结果被错误地解码为了 8 个字符,所以我们要把它转换回去,首先是要还原回原来的那段字节流, 然后再将这段字节流按照正确的编码 (GB18030) 处理:
//scanResultStr为扫描结果
NSData *data=[scanResultStr dataUsingEncoding:NSUTF8StringEncoding];
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSString *dealwithStr = [[NSString alloc] initWithData:data encoding:enc];
//如果扫描中文乱码则需要处理,否则不处理
if (dealwithStr){
NSInteger max = [scanResultStr length];
char *nbytes = malloc(max + 1);
for (i = 0; i < max; i++){
unichar ch = [scanResultStr characterAtIndex: i];
nbytes[i] = (char) ch;
}
nbytes[max] = '\0';
result=[NSString stringWithCString: nbytes encoding: enc];
}