5

使用 ZBar 扫描 QR 码时,该过程产生的字符串无法正确显示 unicode 字符。任何免费使用的 QR 码生成器(如http://qrcode.kaywa.com )将Márti编码为 QR 码的单词将导致Mテ。rti

在其他 SO 问题(12)中,建议在结果字符串的开头嵌入 BOM,但这样做:

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

或这个:

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

导致了与亚洲角色相同的、有缺陷的结果。symbol.data是 ZBar 提供的结果 NSString。

更新:根据 dda 的回答,解决方案如下:

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];
}
4

3 回答 3

4

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

于 2012-11-15T11:51:53.113 回答
2

我可以使用以下库创建“日本语”(日语)和“Márti”的二维码:

您可以使用 ZBar 读取这些二维码。

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];
于 2013-06-11T13:53:50.763 回答
0

请注意,目前的解决方案将不包括在日本使用以及扫描内部带有实际汉字编码的 QR 码。事实上,它可能会为任何在 canBeConvertedToEncoding:NSShiftJISStringEncoding 中包含 Unicode 字符的 QR 码造成问题。

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

于 2013-03-05T23:38:27.170 回答