iOS:ZBar SDK unicode字符

使用ZBar扫描QR码时,由该过程产生的string不能正确显示Unicode字符。 任何自由使用二维码生成器(如http://qrcode.kaywa.com )编码为QR码的词Márti将导致Mテ.rti

在其他SO问题( 1,2 )中,build议在结果string的开始处embeddedBOM,但是这样做:

NSString *qrString = [NSString stringWithFormat:@"\xEF\xBB\xBF%@",symbol.data]; 

或这个:

 NSString *qrString = [[NSString alloc] initWithFormat:@"\357\273\277%@", symbol.data]; 

导致了与亚洲人相同的,有缺陷的结果。 symbol.data是由ZBar提供的结果NSString。

更新:基于达达的答案,解决scheme如下:

 NSString *qrString = symbol.data; //look for misinterpreted acute characters and convert them to UTF-8 if ([qrString canBeConvertedToEncoding:NSShiftJISStringEncoding]) { qrString = [NSString stringWithCString:[symbol.data cStringUsingEncoding: NSShiftJISStringEncoding] encoding:NSUTF8StringEncoding]; } 

我可以用下面的库创build“日本语”(日语)和“Márti”的QR码:

  • IOS的QR码编码器
  • QR-Code-Encoder-for-Objective-C 。

你可以用ZBar读取这些QR码。

iOS-QR-Code-Encoder :

 NSString* orginalString = @"Márti"(or "日本語"(japanese)); NSString *data = [[NSString alloc] initWithFormat:@"\357\273\277%@", orginalString]; UIImage* qrcodeImage = [QRCodeGenerator qrImageForString:data imageSize:imageView.bounds.size.width]; 

QR-Code-Encoder-for-Objective-C :

 NSString* orginalString = @"Márti"(or "日本語"(japanese)); NSString *data = [[NSString alloc] initWithFormat:@"\357\273\277%@", orginalString]; //first encode the string into a matrix of bools, TRUE for black dot and FALSE for white. Let the encoder decide the error correction level and version DataMatrix* qrMatrix = [QREncoder encodeWithECLevel:QR_ECLEVEL_AUTO version:QR_VERSION_AUTO string:data]; //then render the matrix UIImage* qrcodeImage = [QREncoder renderDataMatrix:qrMatrix imageDimension:qrcodeImageDimension]; 

根据关于QR的维基百科页面 ,二进制数据的编码[Márti将应用]是ISO 8859-1。 这可能是一个编码为unicode编码问题。 但是在那里看到一个汉字,可能是因为QR编码问题:可能文本不是ASCII,默认编码为Shift JIS X 0208(即汉字/假名)。

只要谨慎一点,这个解决scheme将不包括在日本的使用和内部实际汉字编码扫描QR码。 实际上,它可能会为canBeConvertedToEncoding:NSShiftJISStringEncoding中的任何带有Unicode字符的QR码创build问题。

更通用的解决scheme是在QR码编码之前插入BOM字符以强制UTF-8编码(在创build之前)。 ZBar从来不是这里的问题,它是植根于QR码的创build。