From 9f76bb31da6c88de60eec7fdca4ea9ede24f3758 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E8=88=AA=E5=AE=87?= <3364451258@qq.com> Date: Thu, 18 Jun 2026 11:34:05 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20QR=20=E9=A2=84=E8=A7=88=E4=BC=98?= =?UTF-8?q?=E5=8C=96=20=E2=80=94=20=E7=A7=BB=E9=99=A4=E8=99=9A=E7=BA=BF?= =?UTF-8?q?=E8=BE=B9=E6=A1=86/=E5=9C=86=E8=A7=92/padding=EF=BC=8C=E4=B8=93?= =?UTF-8?q?=E4=B8=9A=E7=99=BD=E5=BA=95+=E5=BE=AE=E9=98=B4=E5=BD=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 去掉 border-dashed / rounded-2xl / p-4(干扰扫描) - 纯白容器 + shadow-sm,干净专业 - svgToDataUrl 改用 TextEncoder(替代废弃的 unescape) Co-Authored-By: Claude --- gui/src-frontend/src/components/QrPreview.tsx | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/gui/src-frontend/src/components/QrPreview.tsx b/gui/src-frontend/src/components/QrPreview.tsx index 36360f2..7ecc85a 100644 --- a/gui/src-frontend/src/components/QrPreview.tsx +++ b/gui/src-frontend/src/components/QrPreview.tsx @@ -1,10 +1,12 @@ import { useMemo } from 'react'; import { useQrState } from '../store/qrContext'; -/** 将 SVG 字符串转为安全的 data URL( 标签中浏览器会阻止 SVG 内的脚本执行) */ +/** SVG 字符串 → data URL(安全渲染,img 上下文阻止脚本执行) */ function svgToDataUrl(svg: string): string { - const encoded = btoa(unescape(encodeURIComponent(svg))); - return `data:image/svg+xml;base64,${encoded}`; + // TextEncoder 比 btoa(unescape(...)) 更可靠,正确支持 UTF-8 + const bytes = new TextEncoder().encode(svg); + const binStr = Array.from(bytes, (b) => String.fromCharCode(b)).join(''); + return `data:image/svg+xml;base64,${btoa(binStr)}`; } export default function QrPreview() { @@ -15,10 +17,13 @@ export default function QrPreview() { [state.preview?.svg], ); + const containerCls = + 'w-64 h-64 flex items-center justify-center bg-white rounded-xl shadow-sm'; + if (!svgDataUrl) { return (
-
+
{state.loading ? ( 生成中... ) : ( @@ -31,16 +36,18 @@ export default function QrPreview() { return (
- {/* SVG 转为 data URL 通过 渲染,浏览器在 img 上下文中阻止脚本执行 */} - QR 码 -
- 版本: {state.preview!.version} + {/* 纯白背景 + 微阴影,无边框/圆角干扰扫描 */} +
+ QR 码 +
+
+ 版本 {state.preview!.version} {state.preview!.size}×{state.preview!.size} - 掩码: {state.preview!.mask} + 掩码 {state.preview!.mask}
);