Android java utf-8编码的字符串

use*_*810 0 java android character-encoding zbar-sdk zbar

我正在尝试使用zbar库构建一个Android应用程序来扫描代码.我使用UTF-8编码生成QR码,并使用此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);
Run Code Online (Sandbox Code Playgroud)

从日志我得到:

CUSTOM_DEBUG_TAG(11987): result L'??toile, string L'??toile. latin1 result L'ï¾ï½©toile. utf8 result L'??toile
Run Code Online (Sandbox Code Playgroud)

在字符集和编码方面我有点迷失所以请耐心等待.从上面的日志中,我可以确认zbar库实际上是返回UTF-8编码的字符串"L'étoile"吗?如果是这样,它不应该在日志中正确显示?

我相信zbar使用iconv并默认为ISO-8859-1.所以我也尝试用iso-8859-1编码的文本生成QRcode.然后我尝试用Android应用程序读取QRcode,日志显示:

CUSTOM_DEBUG_TAG(11987): result L'?oile, string L'?oile. latin1 result L'é¨oile. utf8 result L'?oile
Run Code Online (Sandbox Code Playgroud)

所以你可以看到我无法找回重音字符串"L'étoile".显然,我无法掌握一些概念,希望得到一些帮助.

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

谢谢

小智 5

经过一些试验和错误后,似乎zbar不使用ISO-8859-1编码,而是在找到特殊字符时使用Shift_JIS.这对我有用:

byte[] b = sym.getData().getBytes("Shift_JIS");
String value = new String(b, "UTF-8");
Run Code Online (Sandbox Code Playgroud)