使用 ISO-8859-1 编码解析 DataMatrix 时出现未知编码错误

Posted

技术标签:

【中文标题】使用 ISO-8859-1 编码解析 DataMatrix 时出现未知编码错误【英文标题】:Unknown encoding error when parsing DataMatrix with ISO-8859-1 encoding 【发布时间】:2021-05-06 02:21:42 【问题描述】:

开发一个使用 Google 的 MLKit 扫描数据矩阵代码的 android 应用程序,我无法使用以 ISO-8859-1 编码并包含非 ASCII 字符的数据解析代码。

这是一个例子: DataMatrix failing with ML Kit

val options = BarcodeScannerOptions.Builder()
    .setBarcodeFormats(Barcode.FORMAT_DATA_MATRIX)
    .build()
val scanner = BarcodeScanning.getClient(options)
scanner.process(image).addOnSuccessListener  barcodes ->
  val barcode = barcodes.firstOrNull()
  Log.i(TAG, barcode?.rawValue)
  Log.i(TAG, String(barcode?.rawBytes!!, StandardCharsets.ISO_8859_1))

两个日志语句都返回一个表示“未知编码”(字面意思)的字符串。

我正在使用最新版本的 MLKit 条码扫描库:

implementation 'com.google.mlkit:barcode-scanning:16.1.1

ZXing 可以胜任,但它在识别现实生活中遇到了更多困难,扫描并不那么完美。

任何想法,任何提示?

【问题讨论】:

也许它正在以文本模式处理?在文本模式下,它只能处理 ASCII 字符。 Data Matrix - Wikipedia 两种软件中是否有任何选项可以在编码和解码时显式指定 Base256 模式?也许如果您正在处理 ISO-8859-1 编码数据,您可能需要设置这些模式和选项以将字符串转换为字节数组。 您能分享您使用 ISO-8859-1 编码的 DataMatrix 条形码图像吗?我们会将案件转交我们的研究小组进行进一步调查。谢谢! -- 来自 ML Kit 团队 @JulieZhou 刚刚添加了一个带有 ISO-8859-1 编码的官方德国药物计划数据矩阵的示例。提前感谢您的帮助! 感谢 Dirk,将进一步查看示例条码。 谢谢你,朱莉!希望有一个解决方案 - 这是一个相当常见的用例。丑陋的是我们仍然必须处理非 unicode 编码,但别无选择。 【参考方案1】:

条形码图片的问题是条形码周围没有填充,这将返回一个空结果。

在条码内容周围添加一些填充后,就会检测到条码。 。

【讨论】:

对不起,填充,但它仍然失败。在我的应用程序中,barcode?.rawvalue 的输出包含随机的“未知编码”字符串:<MP v="026" U="E96E28692A2444A38661426EBEDAF0A8" l="de-DE"><P Unknown encoding="U123456789" ... ZXing 的输出:<MP v="026" U="E96E28692A2444A38661426EBEDAF0A8" l="de-DE"><P g="Bärbel" f="Müller" egk="U123456789" ... 您好,通过使用 mlkit vision quiclkstart 应用程序和您的 BarcodeScanner 设置,我可以在扫描此条形码时从实时预览中获得结果,也可以将此图像下载到我的设备并转换为位图。您能否在此处查看 mlkit 快速入门应用程序代码:github.com/googlesamples/mlkit/blob/… 以从 url 读取位图并将其提供给条形码扫描仪 api? InputImage 可能存在问题。 嗨晨曦,现在,我用 Vision QuickStart 重试了一次,结果还是一样,但又坏了。请参阅由于非 ASCII 字符而破坏 XML 的“未知编码”字符串:2021-03-03 20:22:21.496 18480-18480/com.google.mlkit.vision.demo I/BarcodeProcessor: <MP v="026" U="E96E28692A2444A38661426EBEDAF0A8" l="de-DE"><P Unknown encoding="U123456789" b="19400101"/> ... 抱歉误读了您之前的回复。我将与内部团队核实,看看他们是否可以改善这一结果。 "条形码原始值:

嗨 Dirk Spöri,您介意我们在内部单元测试中使用这个 image 吗?【参考方案2】:

使用最新版本的 ML Kit 条形码扫描库 16.1.2,rawBytes 方法现在返回 QR 码的预期内容,也适用于非 unicode 编码。

implementation 'com.google.mlkit:barcode-scanning:16.1.2'

【讨论】:

以上是关于使用 ISO-8859-1 编码解析 DataMatrix 时出现未知编码错误的主要内容,如果未能解决你的问题,请参考以下文章

乱码问题

iso-8859-1 是啥编码

使用 NSString 将 UTF-8 编码转换为 ISO 8859-1 编码

在 Jboss 上使用 ISO-8859-1 编码和 JSF 2

XML 解析 - PHP 编码

如何使用编码 ISO-8859-1 在 PHP 中编写文件? [复制]