用Zxing 的core和javase包生成二维码,用默认编码方式时可以识别但是当编码设置为其他时,比如UTF-8或者GB18030时在手机端识别不出来,但是自己写在eclipse 是写个解码确实别的出来。
现在我想要自己生成包含中文的手机能识别的二维码请问要怎么办
代码如下:
生成二维码
public class Encoding {
public void encode(String contents, int width, int height, String imgPath) {
Map<EncodeHintType,Object> hints = new HashMap<EncodeHintType,Object>();
// 指定编码格式
hints.put(EncodeHintType.CHARACTER_SET, "ISO-8859-1");
try {
BitMatrix bitMatrix = new MultiFormatWriter().encode(contents,
BarcodeFormat.QR_CODE, width, height,hints);
MatrixToImageWriter //目测是javase这边的编码方式问题
.writeToFile(bitMatrix, "png", new File(imgPath));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
String imgPath = "e:/test2.png";
String contents = "中!" + "\n zengme buchu lai" ;
int width = 300, height = 300;
Encoding handler = new Encoding();
handler.encode(contents, width, height, imgPath);
System.out.println("create already!.");
}
}
最近也发现了这个问题,后来一次随意的尝试,发现了一点眉目,简单的处理办法如下:
// 指定编码格式
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");// 注意这里utf-8一定要小写
这样就可以解决手机不能识别的问题,而且也能支持中文。
至于原因,查看了源代码后,发现使用“UTF-8”,会在文本编码前添加一段ECI(扩充解释Extended Channel Interpretation)
编码,就是这段编码导致手机不能解析。如果使用小写"utf-8"会使这个ECI判断失效而不影响内容编码方式。
至于详细的ECI解释,可以看《QRCode 编码解码标准》,我也没看懂啥意思。
恩,我去试试,谢谢指导!
试过了,成功了。。。。。。用gbk的时候也要用小写的
@拙急鸟: 至于编码集合可以看com.google.zxing.common.CharacterSetECI中所列举。实际上可以通过修改类:com.google.zxing.qrcode.encoder.Encoder中的DEFAULT_BYTE_MODE_ENCODING常量值为"UTF-8"就好了,以后就默认用"UTF-8",不用每次设置了