ZXing就不过多介绍了,就是可以可以扫描二维码获取里面字符串和把字符串生成二维码的小框架。
本文记录一下源码编译中,ZXing 在源码编译后,包含中文字符串的二维码出现问号乱码解决。
Android Studio中运行该app是没有这个问题的,那么有可能就是编译环境不同导致的。
ImageView imageView; //要显示二维码的控件
String string = "XXX"; // 二维码的字符串
//Zxing 工具类
MultiFormatWriter formatWriter = new MultiFormatWriter()
BitMatrix matrix = formatWriter.encode(string, BarcodeFormat.QR_CODE, viewWidth, viewHeight);
Bitmap bitmap = bitMatrix2Bitmap(string, matrix);
imageView.setImageBitmap(bitmap); //设置二维码图片显示
//像素点确认的方法
public static Bitmap bitMatrix2Bitmap(BitMatrix matrix) {
int w = matrix.getWidth();
int h = matrix.getHeight();
int[] rawData = new int[w * h];
for (int i = 0; i < w; i++) {
for (int j = 0; j < h; j++) {
int color = Color.WHITE;
if (matrix.get(i, j)) {
color = Color.BLACK;
}
rawData[i + (j * w)] = color;
}
}
Bitmap bitmap = Bitmap.createBitmap(w, h, Config.RGB_565);
bitmap.setPixels(rawData, 0, w, 0, 0, w, h);
return bitmap;
}
网上很多说把上面的string 字符串设置一下UTF-8 编码格式就行了,但是我在源码中编译的项目还是不行。
其实有很多的解决办法的,可以在生成二维码的时候,对它进行修改,或者生成二维码之后,对其修改。
今天我就只是在生成二维码的时候对其进行修改。
ImageView imageView; //要显示二维码的控件
String string = "XXX"; // 二维码的字符串
//规避中文字符串,二维码乱码问题
Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
BitMatrix bitMatrix = new MultiFormatWriter().encode(string, BarcodeFormat.QR_CODE, 800, 800, hints);
Bitmap bitmap = bitMatrix2Bitmap(string, matrix);
imageView.setImageBitmap(bitmap); //设置二维码图片显示
其实就是 MultiFormatWriter.encode 的两个不同方法,基本使用的代码未设置编码格式,
后面的是在二维码生成过程设置了"UTF-8"格式。
String string = "XXX";
InputStream inputStream = new ByteArrayInputStream(string.getBytes());
//编码格式:UTF-8,GBK,ISO-8859-1, ...
String encodingTypeString = new InputStreamReader(inputStream).getEncoding();
//api:
String string = "XXX";
String encodeString = new String(string.getBytes("oldType"), "newType");
//示例:
try {
String encodeString = new String(string.getBytes("UTF-8"), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
public static boolean isUtf8(byte[] buffer) {
boolean isUtf8 = true;
int end = buffer.length;
for (int i = 0; i < end; i++) {
byte temp = buffer[i];
if ((temp & 0x80) == 0) {// 0xxxxxxx
continue;
} else if ((temp & 0xC0) == 0xC0 && (temp & 0x20) == 0) {// 110xxxxx 10xxxxxx
if (i + 1 < end && (buffer[i + 1] & 0x80) == 0x80 && (buffer[i + 1] & 0x40) == 0) {
i = i + 1;
continue;
}
} else if ((temp & 0xE0) == 0xE0 && (temp & 0x10) == 0) {// 1110xxxx 10xxxxxx 10xxxxxx
if (i + 2 < end && (buffer[i + 1] & 0x80) == 0x80 && (buffer[i + 1] & 0x40) == 0
&& (buffer[i + 2] & 0x80) == 0x80 && (buffer[i + 2] & 0x40) == 0) {
i = i + 2;
continue;
}
} else if ((temp & 0xF0) == 0xF0 && (temp & 0x08) == 0) {// 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
if (i + 3 < end && (buffer[i + 1] & 0x80) == 0x80 && (buffer[i + 1] & 0x40) == 0
&& (buffer[i + 2] & 0x80) == 0x80 && (buffer[i + 2] & 0x40) == 0
&& (buffer[i + 3] & 0x80) == 0x80 && (buffer[i + 3] & 0x40) == 0) {
i = i + 3;
continue;
}
}
isUtf8 = false;
break;
}
return isUtf8;
}
Android Zxing 扫码中文乱码解决:
判断是否utf-8,设置一次字符串是GBK或者UTF-8
https://blog.csdn.net/qq_25148525/article/details/124472345
Android ZXing生成中文二维码,扫描后出现问号、乱码问题解决:
https://blog.csdn.net/PenTablet/article/details/80325741
本文的处理也是参考这个文章的。