项目中使用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;
}