0

我正在尝试使用zbar库构建一个 Android 应用程序来扫描代码。我生成了 UTF-8 编码的二维码,并正在使用这个 Android 应用程序来扫描它们。我正在编码的文本是“L'étoile”。我尝试了默认的 zbar 测试程序,发现它不能正确显示重音字符。所以我在下面稍微修改了它的代码,以便调试它并理解它为什么不能正确显示字符。

byte[] bytes = sym.getDataBytes();
String latin1Result = new String(bytes, "ISO8859-1");
String utf8Result = new String(bytes, "UTF-8");
Log.d("CUSTOM_DEBUG_TAG", "result " + sym.getData() + ", string " + sym.getData().toString() + ". latin1 result " + latin1Result + ". utf8 result " + utf8Result);

从日志中我得到:

CUSTOM_DEBUG_TAG(11987): result L'テゥtoile, string L'テゥtoile. latin1 result L'ï¾ï½©toile. utf8 result L'テゥtoile

在字符集和编码方面我有点迷茫,所以请多多包涵。从上面的日志中,我可以确认 zbar 库实际上返回了一个 UTF-8 编码的字符串“L'étoile”吗?如果是这样,它不应该在日志中正确显示吗?

我相信 zbar 使用 iconv 并且默认为 ISO-8859-1。所以我也尝试生成一个带有 iso-8859-1 编码文本的二维码。然后我尝试使用 Android 应用程序读取二维码,日志显示如下:

CUSTOM_DEBUG_TAG(11987): result L'騁oile, string L'騁oile. latin1 result L'é¨oile. utf8 result L'騁oile

如您所见,我无法检索重音字符串“L'étoile”。显然,有些概念我无法掌握,希望能有所帮助。

顺便说一句,如果我使用 QR Droid 或 Zxing 等应用程序扫描相同的二维码,我会得到正确显示为“L'étoile”的字符串(因此我放弃了二维码本身可能存在问题的事实)。

谢谢

4

2 回答 2

5

经过反复试验,zbar 似乎不使用 ISO-8859-1 编码,而是在发现特殊字符时使用 Shift_JIS。这对我有用:

byte[] b = sym.getData().getBytes("Shift_JIS");
String value = new String(b, "UTF-8");
于 2014-02-26T17:36:50.930 回答
0

缺少破折号 (-)。

String latin1Result = new String(bytes, "ISO-8859-1");

简单地使用 new String(bytes) 将使用默认平台编码,这会创建一个不太便携的应用程序。

如果这没有帮助,请尝试使用字符串文字来查看问题是否出在输出上。

String result = "\u00e9toile";
于 2012-12-29T23:18:16.140 回答