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

更多相关文章

  1. Android解决TextView setText显示乱码
  2. 手动从Eclipse移植Android项目到Android(安卓)Studio记录
  3. Android字符串资源及其格式化
  4. 通过google接口在Android中实现天气预报效果
  5. Android(安卓)SharedPreferences详解
  6. Android(安卓)正则表达式学习
  7. 分支和循环(二)(零基础学习C语言)
  8. C虾仔笔记 - 数据存储
  9. Android(安卓)JNI和NDK学习(5)--JNI分析API

随机推荐

  1. OpenAL播放pcm或wav数据流-windows/ios/a
  2. [置顶] Android使用TextureView播放视频
  3. 【Android】Sensor框架HAL层解读
  4. 关于调试的一个问题
  5. Android手势ImageView三部曲 第三部
  6. android的socket开发注意事项
  7. Android学习资源-retrofit,eventBus,butter
  8. Android(安卓)自动化测试
  9. 寻找android中的设计模式(一)
  10. Android studio连接Bmob云数据库教程