iOS 原生二维码扫描不出带有中文的GBK编码数据

最近做的一个项目中有用到二维码扫描, 但在测试过程中发现用 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];
     }
posted @ 2018-03-25 20:15  coder0122  阅读(1635)  评论(0编辑  收藏  举报