endroid/qr-code生成二维码,中文乱码的解决方案

endroid/qr-code version:6.0.3 默认不支持中文;

1、https://fonts.google.com/noto/fonts,从这里下载字体;

2、下载简体中文:Noto Sans Simplified Chinese

3、下载后,把压缩包解压,把`NotoSansSC-Regular.ttf`字体,保存在`endroid/qr-code/assets/`文件夹里;

4、照猫画虎:`endroid/qr-code/src/Label/Font/`里的`OpenSans.php`复制一份,重新命名:`NotoSans.php`;

5、NotoSans.php的代码如下:

<?php

declare(strict_types=1);

namespace Endroid\QrCode\Label\Font;

final readonly class NotoSans implements FontInterface
{
    public function __construct(
        private int $size = 16,
    ) {
    }

    public function getPath(): string
    {
        return __DIR__.'/../../../assets/NotoSansSC-Regular.ttf'; // 路径与字体名称一定要正确;
    }

    public function getSize(): int
    {
        return $this->size;
    }
}

6、生成二维码的代码如下:

use Endroid\QrCode\Builder\Builder;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel;
use Endroid\QrCode\Label\LabelAlignment;
use Endroid\QrCode\Label\Font\NotoSans; // 和前面我们修改的文件名,保持一致;
use Endroid\QrCode\RoundBlockSizeMode;
use Endroid\QrCode\Writer\PngWriter;

public function genQrCode()
    {
        $builder = new Builder(
            writer: new PngWriter(),
            writerOptions: [],
            validateResult: false,
            data: 'https://www.sohu.com/',
            encoding: new Encoding('UTF-8'),
            errorCorrectionLevel: ErrorCorrectionLevel::High,
            size: 300,
            margin: 10,
            roundBlockSizeMode: RoundBlockSizeMode::Margin,
            // logoPath: __DIR__.'/assets/symfony.png',
            // logoResizeToWidth: 50,
            // logoPunchoutBackground: true,
            labelText: '搜狐',
            labelFont: new NotoSans(20), // 这里也要保持一致;
            labelAlignment: LabelAlignment::Center
        );
        
        $result = $builder->build();
        $dataUri = $result->getDataUri();
        return '<img src="'.$dataUri.'">';
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值