Android使用me.dm7.barcodescanner:zxing扫描二维码乱码问题处理

孟鸿德
2023-12-01

项目中使用me.dm7.barcodescanner:zxing实现扫描二维码、条形码的功能,部分二维码出现乱码问题,解决方法如下:

ZXingScannerView.ResultHandler.handleResult中增加结果的乱码判断,若乱码,则转换字符集。

public void handleResult(Result result) {
	String str = result.getText().trim();
	// 去除BOM
	if (str.startsWith("\uFEFF")) {
	    str = str.substring(1);
	}
	String resultStr = str;
	// 判断是否乱码
	if (isMessyCode(resultStr)) {
	    try {
	        // 转成utf-8
	        String UTF_Str = new String(str.getBytes("ISO-8859-1"), "UTF-8");
	        boolean is_cN = isChineseCharacter(UTF_Str);
	        //防止有人特意使用乱码来生成二维码来判断的情况
	        boolean b = isSpecialCharacter(str);
	        if (b) {
	            is_cN = true;
	        }
	        if (is_cN) {
	            resultStr = UTF_Str;
	        } else {
	            resultStr = new String(str.getBytes("ISO-8859-1"), "GB2312");
	        }
	    } catch (UnsupportedEncodingException e) {
	        e.printStackTrace();
	    }
	}
	
	Intent intent = new Intent();
	intent.putExtra(QRCODE_RESULT, resultStr);
	setResult(RESULT_CODE_QR, intent);
	finish();
}

private boolean isChineseCharacter(String chineseStr) {
	char[] charArray = chineseStr.toCharArray();
	for (int i = 0; i < charArray.length; i++) {
	    //是否是Unicode编码,除了"?"这个字符.这个字符要另外处理
	    if ((charArray[i] >= '\u0000' && charArray[i] < '\uFFFD')||((charArray[i] > '\uFFFD' && charArray[i] < '\uFFFF'))) {
	        continue;
	    } else{
	        return false;
	    }
	}
	return true;
}

private boolean isSpecialCharacter(String str){
    //是"?"这个特殊字符的乱码情况
    if(str.contains("???")){
        return true;
    }
    return false;
}

private static boolean isMessyCode(String strName) {
    try {
        Pattern p = Pattern.compile("\\s*|\t*|\r*|\n*");
        Matcher m = p.matcher(strName);
        String after = m.replaceAll("");
        String temp = after.replaceAll("\\p{P}", "");
        char[] ch = temp.trim().toCharArray();

        int length = (ch != null) ? ch.length : 0;
        for (int i = 0; i < length; i++) {
            char c = ch[i];
            if (!Character.isLetterOrDigit(c)) {
                String str = "" + ch[i];
                if (!str.matches("[\u4e00-\u9fa5]+")) {
                    return true;
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    return false;
}
 类似资料: