生成二维码时出现西里尔字母问题

问题描述 投票:0回答:1

我正在生成支付二维码。

public GenerateQrResponse createQr(CreateQrRequest request) {
        var bnplEntity = bnplRepository.findByOrderId(request.getOrderNumber());
        if (bnplEntity.isEmpty()) {
            messengerUtils.sendTelegramBotMessage(telegramChatId, "bnpl not found by orderId. createQr method, orderNumber = " + request.getOrderNumber());
            throw new RuntimeException("bnpl entity not found while requesting qr code for bnpl with order number = " + request.getOrderNumber());
        }
        var bnplDto = bnplService.prepareBnplResponse(bnplEntity.get());
        bnplDto.setBnplId(bnplEntity.get().getId());
        bnplDto.setDate(bnplEntity.get().getCreatedAt());
        String linkUrl = bnplUrlService.getBnplUrl(bnplDto);

        BufferedImage logoImage = createRedCircleImage(50, 50);
        String logoBase64 = convertImageToBase64(logoImage);

        try {
            QRCodeWriter qrCodeWriter = new QRCodeWriter();
            BitMatrix bitMatrix = qrCodeWriter.encode(linkUrl, BarcodeFormat.QR_CODE, 250, 250, getQrCodeHintMap());

            BufferedImage qrImage = MatrixToImageWriter.toBufferedImage(bitMatrix);

            byte[] logoBytes = Base64.getDecoder().decode(logoBase64);
            ByteArrayInputStream logoStream = new ByteArrayInputStream(logoBytes);
            logoImage = ImageIO.read(logoStream);

            BufferedImage combined = new BufferedImage(250, 250, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = combined.createGraphics();
            g.drawImage(qrImage, 0, 0, null);
            int x = (combined.getWidth() - logoImage.getWidth()) / 2;
            int y = (combined.getHeight() - logoImage.getHeight()) / 2;
            g.drawImage(logoImage, x, y, null);
            g.dispose();

            ByteArrayOutputStream combinedOutputStream = new ByteArrayOutputStream();
            ImageIO.write(combined, "PNG", combinedOutputStream);
            byte[] imageBytes = combinedOutputStream.toByteArray();
            return new GenerateQrResponse(Base64.getEncoder().encodeToString(imageBytes), request.getOrderNumber(), request.getAmount(), linkUrl);
        } catch (IOException | WriterException e) {
            throw new RuntimeException(e.getMessage());
        }
    }

问题是:当我为 qr 构建 DTO 时,我需要输入地址。如果地址是英文的话,没有任何问题。 但如果地址是西里尔文,则在 qr 链接中所有西里尔文文本都会变成 ??????

主要问题是我的所有地址都是西里尔字母,我们的系统是这样工作的。 这里是DTO

return BnplDTO.builder()
                      .bnplId(bnpl.getId())
                      .amount(bnpl.getAmount())
                      .bin("111111111111")
                      .address("ул. Астана 58А")
                      .legalName("Example")
                      .build();

我正在使用 qrgen 库

<dependency>
            <groupId>net.glxn</groupId>
            <artifactId>qrgen</artifactId>
            <version>1.4</version>
</dependency>

有想法更改库,但可能有人知道如何解决这个问题? 预先感谢

java spring qr-code
1个回答
0
投票

据我所知,QR 码用于指向 URL。它们通常编码为 UTF-8。可以肯定的是,请使用 URL 编码。请参阅https://stackoverflow.com/a/10786112/4222206

另一种选择是不将全部数据放入二维码中,而是生成带有(交易)代码的 URL,该代码可返回您的网站,然后生成完整信息。

© www.soinside.com 2019 - 2024. All rights reserved.