Android ZXing二维码包含中文时乱码解决

2024-01-02 22:07:43

Android ZXing二维码包含中文时乱码解决

一、前言

ZXing就不过多介绍了,就是可以可以扫描二维码获取里面字符串和把字符串生成二维码的小框架。

本文记录一下源码编译中,ZXing 在源码编译后,包含中文字符串的二维码出现问号乱码解决。

Android Studio中运行该app是没有这个问题的,那么有可能就是编译环境不同导致的。

二、ZXing 把中文字符串生成二维码扫描后显示问号解决

1、Zxing 的简单使用

 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;
}

2、源码上的编译的项目二维码乱码修改

网上很多说把上面的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"格式。

二、其他

1、查看字符串编码:

String string = "XXX";
InputStream inputStream = new ByteArrayInputStream(string.getBytes());
//编码格式:UTF-8,GBK,ISO-8859-1, ...
String encodingTypeString = new InputStreamReader(inputStream).getEncoding();

2、字符串设置编码:

//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();
}

3、是否utf-8字符串

    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;
    }

4、网上其他的处理方式

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

本文的处理也是参考这个文章的。

文章来源:https://blog.csdn.net/wenzhi20102321/article/details/135349807
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。