欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

zxing中文字符乱码解决

程序员文章站 2024-01-27 00:02:10
...
package com.zpr.code;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.HashMap;

/**
 * @ClassName CreateQRCode
 * @Description
 * @Author zhoup
 * @Date 2019/2/15  9:20
 * @Version 1.0
 **/
public class CreateQRCode {
    public static void main(String[] args) {
//        定义二维码的规格
        int width = 300;
        int height = 300;
        String format = "png";
        String content = "慕课";


//        定义二维码的参数
        HashMap hints = new HashMap();
//        定义字符编码
        hints.put(EncodeHintType.CHARACTER_SET,"utf-8");
//        纠错级别
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
//        边距
        hints.put(EncodeHintType.MARGIN,2);
//        生成二维码
        try {
            BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE,width,height);
            Path file = new File("D:/javacode/img/img.png").toPath();
            MatrixToImageWriter.writeToPath(bitMatrix,format,file);
        } catch (WriterException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

生成的二维码扫描结果为???

解决方法:

添加

content = new String(content.getBytes("UTF-8"),"iso-8859-1");

网上查询到另一种解释和方法:

1 进入qrcode 下的encode文件夹,修改Encode.cs下的语句

internal const System.String DEFAULT_BYTE_MODE_ENCODING = "ISO-8859-1";

改为 internal const System.String DEFAULT_BYTE_MODE_ENCODING = “UTF-8”; //选择编码模式

2 进入decode文件夹,修改guessEncoding函数,这个函数的目的是猜测编码类型,不用猜了,我直接把它改为return UTF-8,其余一律注释掉。自己编码的,当然知道编码模式。


原文:https://blog.csdn.net/xiaoyanghijk/article/details/23258897

这个好像的是.net的版本,我在java源码中的Encoder.java中找到

  static final String DEFAULT_BYTE_MODE_ENCODING = "ISO-8859-1";

后文解码猜测我们用的是“ISO-8859-1”,所以以这种方式解码,但是没有对应的字符编码,所以输出“???”
如上面那篇文章的方式,我修改了

static final String DEFAULT_BYTE_MODE_ENCODING = "UTF-8";

然后用IDEA重新生成jar包,中间有个插曲,学习视频和其他博客都是用eclipse生成jar包,所以允许报错生成,但是IDEA不允许,所以需要解决报错的问题,其实就是下载com.beust.jcommander.JCommander的jar包下载
http://maven.outofmemory.cn/com.beust/jcommander/1.35/这个可以直接从中间仓库下载,不用maven,然后将新的jar包导入,注释掉这个

//content = new String(content.getBytes("UTF-8"),"iso-8859-1");

编译运行,然后解析,结果正常:

解析结果:慕课
二维码格式类型:QR_CODE
二维码文本内容:慕课