Android使用me.dm7.barcodescanner:zxing扫描二维码乱码问题处理
16lz
2021-01-26
项目中使用me.dm7.barcodescanner:zxing
实现扫描二维码、条形码的功能,部分二维码出现乱码问题,解决方法如下:
在ZXingScannerView.ResultHandler.handleResult
中增加结果的乱码判断,若乱码,则转换字符集。
public void handleResult(Result result) {String str = result.getText().trim();// 去除BOMif (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;}
更多相关文章
- Android解决TextView setText显示乱码
- 手动从Eclipse移植Android项目到Android(安卓)Studio记录
- Android字符串资源及其格式化
- 通过google接口在Android中实现天气预报效果
- Android(安卓)SharedPreferences详解
- Android(安卓)正则表达式学习
- 分支和循环(二)(零基础学习C语言)
- C虾仔笔记 - 数据存储
- Android(安卓)JNI和NDK学习(5)--JNI分析API