中文编码的iOS原生QRCode扫描仪

时间:2015-10-05 15:54:06

标签: ios objective-c encoding utf-8 qr-code

这个QRCode由中文Big5编码而不是UTF-8创建,我使用iOS本机类,AVMetadataMachineReadableCodeObject,尝试获取结果,但字符串不可读,如下所示:

**·s|¡Àô«OI:1:2:¯Â³ð¯ùºñ¯ù:2:20:一个»¥@®ã¥þ:1:83:ìμѤé|¡ºñ:2 :25:¥Í¬¡ªwªjºñ:2:10

我尝试通过UTF-8将字符串转换为NSData,然后我再次从NSData转换为NSString,由其他编码转换,并且我thnik原始字符串已经得到错误的编码,这就是为什么我可以转换为正确的字符串。

这是正确的内容:

**新式环保背:1:2:纯吃茶绿茶:2:20:乳香世家全:1:83:原萃日式绿:2:25:生活泡沫绿:2:10

The QRCode is here

有没有办法使用iOS本机类获得正确的结果?感谢

2 个答案:

答案 0 :(得分:1)

我找到了答案, QRCode内容字符串编码使用的是NSISOLatin1StringEncoding,而不是NSUTF8StringEncoding。

代码:

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{

    NSMutableString *message = [NSMutableString string];
    for (AVMetadataMachineReadableCodeObject *codeObject in metadataObjects) {

        NSInteger index = [metadataObjects indexOfObject:codeObject];

        NSString *readedString = codeObject.stringValue;

        // Restore raw data using NSISOLatin1StringEncoding.
        NSData *dataString = [readedString dataUsingEncoding:NSISOLatin1StringEncoding allowLossyConversion:NO];

        // Create big5 encoding.
        NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingBig5_HKSCS_1999);

        // Decode data using big5 encoding.
        readedString = [[NSString alloc] initWithData:dataString encoding:encoding];

        [message appendFormat:@"%zd. \"%@\"\n\n", index, readedString];
    }

    NSLog(@"%@", message);
}

答案 1 :(得分:0)

原因是QR码的编码不正确。

我尝试扫描您显示的代码,得到相同的结果。 但我使用你提供的conent,在这个网站(https://cli.im)中,重新创建一个新的qrcode,然后我扫描它并得到正确的结果。