【问题标题】:iOS7 barcode scanner API adds a Zero to UPCA barcode formatiOS7 条码扫描器 API 为 UPCA 条码格式添加了零
【发布时间】:2019-08-07 11:25:37
【问题描述】:

扫描这个(https://www.barcoderobot.com/static/bcgen/01026/478064310081_3b120.jpg?preview=True)条码我们应该得到如下结果:47806431008

使用iOS7 api读取条码,结果如下:047806431008

任何想法如何处理这个?

部分代码:

CGRect highlightViewRect = CGRectZero;
AVMetadataMachineReadableCodeObject *barCodeObject;
NSString *detectionString = nil;
NSArray *barCodeTypes = @[AVMetadataObjectTypeUPCECode, AVMetadataObjectTypeCode39Code, AVMetadataObjectTypeCode39Mod43Code,
                          AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode93Code, AVMetadataObjectTypeCode128Code,
                          AVMetadataObjectTypePDF417Code, AVMetadataObjectTypeQRCode, AVMetadataObjectTypeAztecCode];

for (AVMetadataObject *metadata in metadataObjects) {
    for (NSString *type in barCodeTypes) {
        if ([metadata.type isEqualToString:type])
        {
            barCodeObject = (AVMetadataMachineReadableCodeObject *)[_prevLayer transformedMetadataObjectForMetadataObject:(AVMetadataMachineReadableCodeObject *)metadata];
            highlightViewRect = barCodeObject.bounds;
            detectionString = [(AVMetadataMachineReadableCodeObject *)metadata stringValue];
            break;
        }
    }

    if (detectionString != nil)
    {
        [_session stopRunning];
        [self scanResult:detectionString];
        break;
    }

【问题讨论】:

  • google 截断 nsstring。如果第一个数字为零,则删除它
  • 这并不能解决我的问题,因为苹果以后可以解决这个问题,如果数字真的是 0 我就会有问题。

标签: ios ios7 barcode-scanner


【解决方案1】:

我发现了问题。 Apple 只需添加前导零即可将每个 UPC-A 条码转换为 EAN13。

解决方法是验证条码是否为 EAN13,字符串结果是否有前导零是否安全,将其移除并获得 UPC-A 条码。

if(detectionString!=nil){
    if([metadata.type isEqualToString:AVMetadataObjectTypeEAN13Code]){
        if ([detectionString hasPrefix:@"0"] && [detectionString length] > 1)
            detectionString = [detectionString substringFromIndex:1];
    }
}

Apple 技术说明链接:https://developer.apple.com/library/content/technotes/tn2325/_index.html#//apple_ref/doc/uid/DTS40013824-CH1-IS_UPC_A_SUPPORTED_

更多信息在:http://www-01.ibm.com/support/docview.wss?uid=pos1R1002813

根据统一代码委员会的规定,根据定义,以零开头的 EAN-13 条码是 12 位 UPC-A 条码。为了遵循此规则,当扫描仪设备读取以零开头的 EAN-13 条码时,它会删除前导 0,将条码截断为 12 位,并将 UPC-A(而不是 EAN-13)指示符附加到标签上,在将标签传递给操作系统之前。因此,操作系统无法识别扫描仪设备传递给它的这个 UPC-A 标签最初是一个以零开头的 EAN-13 标签。

【讨论】:

  • 链接已损坏,但到目前为止我还没有找到一个好的等价物,尽管我确信信息是正确的
【解决方案2】:

如果有人对 swift 版本感兴趣。

斯威夫特 3.1:

guard let barcodeReadable = barcodeData as? AVMetadataMachineReadableCodeObject else {
    return
}

guard var barcode = barcodeReadable.stringValue else {
    return
}

if barcodeReadable.type == AVMetadataObjectTypeEAN13Code && barcode.hasPrefix("0"){
    let index = barcode.index(barcode.startIndex, offsetBy: 1)
    barcode = barcode.substring(from: index)
}

【讨论】:

    【解决方案3】:

    正如 Sandro 和 Gunhan 所写:

    解决办法是验证条码是否为EAN13。

    此代码适用于 Swift 4.2 版本:

    if let metadataObject = metadataObjects.first {
            guard let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject else { return }
            guard var stringValue = readableObject.stringValue else { return }
    
            if readableObject.type == AVMetadataObject.ObjectType.ean13 && stringValue.hasPrefix("0"){
                let index = stringValue.index(stringValue.startIndex, offsetBy: 1)
                stringValue = String(stringValue[index...])
    
            }
    

    【讨论】:

    • add为您的解决方案做一些解释
    【解决方案4】:

    在 Swift 5.0 版中经过验证的解决方案具有更好的删除零字符串的方法。

    guard !metadataObjects.isEmpty else { return }
    
    guard let metadataObj = metadataObjects[0] as? AVMetadataMachineReadableCodeObject,
      var barcode = metadataObj.stringValue,
      metadata.contains(metadataObj.type)
      else { return }
    
    var type = metadataObj.type.rawValue
    
    if metadataObj.type == AVMetadataObject.ObjectType.ean13 && barcode.hasPrefix("0") {
      barcode = String(barcode.dropFirst())
      type = AVMetadataObject.ObjectType.upca.rawValue
    }
    

    【讨论】:

      猜你喜欢
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多