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。