# 二维码与条形码 离线生成二维码和条码

打进去，就变成一个码。生成过程不往外送任何东西。

> 生成链接、Wi-Fi 或者名片二维码，也生成 EAN-13、UPC-A、Code 128 和 Code 39 条形码。可下载 SVG 或 PNG。全部在你的浏览器里完成。

这是一个浏览器交互工具，地址是 https://abox.tools/zh/qr-barcode/。文件在运行该浏览器的设备上处理。主动分享和可选联网功能都在页面上说明。下文是它的文字说明；使用工具请打开该地址。

## 你的码和码里的文字**在浏览器里处理**，无须上传处理。

二维码不过是对一串字符做算术，没有文件要送，也没有服务要求人。选模式、定版本、算里德所罗门纠错、挑掩码、排条码的粗细条、算下面那位校验码，每一步都发生在这个页面里，一千来行你能读的 JavaScript。这个工具没有任何联网功能。这一条在这儿比在别的页面更要紧，因为被编进码里的，常常是一个 Wi-Fi 密码。

- ✗ 不上传
- ✗ 不注册
- ✗ 不过期
- ✓ 断网能用
- ✓ 开源

## 不上传怎么生成二维码

1. **先挑码的种类。** 二维码什么都装得下，也是手机摄像头默认要找的东西，所以除非有人另有要求，答案就是它。条形码装的是一串数字，具体要哪一种，由将来扫它的那一方说了算：商店要 EAN-13 或者 UPC-A，运输纸箱要 ITF-14，公司内部用的一般是 Code 128。
2. **说清楚码里装什么。** 最常见的是一个链接，上面那几个表单则负责拼出手机认得的其他格式：一个能自动加入的 Wi-Fi、一张能提示保存的名片、一封邮件、一条短信、一个电话号码、一个地图位置。不管你选哪个，拼好的那串字符都会显示在页面上，因为二维码里装的从来就只有它。
3. **决定它能挨多少损伤。** 四个等级放进去的纠错数据一档比一档多，而纠错越多，码就越大越密。屏幕上看 L 就够，普通纸张用 M，要被反复摸、印得很小、或者贴在晒得到太阳的橱窗上，用 H。菜单上那种每天要擦一遍的码，值得上 Q 或者 H。
4. **定尺寸、留白和颜色。** 留白是码的一部分。规范要求四边各留四个模块的空白，把它裁掉，是印出来的码扫不出来最常见的单一原因。深色在浅色上，而且对比要真够：读取器量的是两者之差，所以白底浅灰不行，浅色在深底上更是有相当多的读取器直接不认。
5. **拿你手上这部手机试一下。** 印一千份之前，先扫屏幕上这个。十秒钟的事，却能挡住一整类预览看不出来的毛病：Wi-Fi 密码里有个字符本该转义、链接漏了 `https://`、条码数字少了一位。
6. **拿 SVG。** 它是以指令表达的码，不是一堆像素，所以印多大都不发虚，而发虚的边缘正是扫描器最分辨不了的东西。你要粘进去的地方要是不认 SVG，那就顺手也拿上 PNG，它按每个模块整数个像素画出来，同样没有糊掉的边。

## 说得更细的版本

[怎么做一个到了别人手机上还扫得出来的二维码](https://abox.tools/zh/guides/make-a-qr-code/): 纠错等级该选哪个，二维码周围那圈白为什么是码的一部分，印多大合适，还有免费生成器的“动态码”日后要你付出什么。

## 工具箱里还有

- [二维码与条形码识读](https://abox.tools/zh/qr-barcode-reader/): 把摄像头对准码，或者把拍下来的图丢进来。读这件事只发生在这里，别处都没有。
- [哈希与校验和](https://abox.tools/zh/hash-checksum/): 把下载来的文件和发布方公布的那串数字对一下，不用把它发给任何人。
- [密码与密码短语生成器](https://abox.tools/zh/password-generator/): 在这里生成，由你自己的浏览器生成，不发往任何地方。什么都不保存，也没有历史记录。
- [JSON 格式化](https://abox.tools/zh/json-formatter/): JSON、XML、HTML、CSS 和 YAML，格式化或转换。没有一个字被贴进别人的服务器。

## 常见问题

### 我打进去的东西会被发到什么地方吗？

不会。二维码就是对一串字符做算术，而这套算术在你自己的浏览器里、你自己的机器上跑。这个工具没有任何联网功能，不取东西，也不发东西。页面的 `Content-Security-Policy` 把它可能联的地址全列了出来，没有一个是本站的。这一点在这儿比在别的页面更值钱，因为人们最常塞进二维码的，就是自家 Wi-Fi 的密码。

### 这些码会过期吗？会哪天突然失效吗？

不会，也不可能。你打进去什么，码里就装什么，扫出来永远是那串字符。会过期的是那种里面装着别人地址的码：所谓“动态”二维码，装的是通往生成方服务器的链接，再由那边跳到你这儿。于是他们能数走每一次扫描，能改目的地，也能在试用期结束那天把它关掉。这里没有任何东西经别人中转。

### 免费吗？能商用吗？

免费，没有账号，没有水印，生成多少个都不限，结果放到产品上、海报上、店面上都行。QR Code 是电装（Denso Wave）的注册商标，他们公开表示不会对使用这种码的人主张这项商标，规范以 ISO/IEC 18004 公开发布，任何人都可以自由实现，这个页面做的就是这件事。本站带广告，经费就是这么来的。

### 纠错等级该选哪个？

没有特别理由就选 M。L 生成的码最小，屏幕上完全够用；M 扛得住日常翻动；Q 和 H 留给那些要印得很小、要过塑、要贴橱窗、或者中间会被 logo 盖住一块的码。每往上一档，塞进去的校验数据就多一些，同样多的文字就需要一个更大的图形，从 L 换到 H，同一串字符的模块数大约要翻一倍。

### 一个二维码能装多少东西？

最大那一档是 ⁦177 × 177⁩ 个模块，最多装 7089 位数字、4296 个大写字母和数字，或者 2953 字节的其他内容，而这还是在最弱纠错下的数字，最强纠错大约只有三分之一。实际上卡住你的不是格式，是扫描器：过了几百个字符，模块就小到普通手机摄像头在一臂之外分辨不出来了。码一长，通常说明里面该换成一个短链接。

### 链接改成小写，码怎么反而变大了？

因为二维码有一种专门装大写字母和数字的模式，两个字符压进十一位；小写没有这种模式，一个字符要八位。同一个网址写成 `HTTPS://EXAMPLE.COM/PAGE`，可以比小写版本小三分之一。协议名和主机名本来就不区分大小写，喊成大写除了变小什么都不影响；主机后面那段路径可是区分的，别去动它。

### 它能扫码吗，还是只能生成？

这一页做不到，隔壁那页可以：[识读工具](https://abox.tools/zh/qr-barcode-reader/)接一张照片、一张截图或者你的摄像头，把里面那串字符还给你。这比画一个码大得多——在一张图里找出那个图形、把拍摄角度纠正回来、再把破损的地方修回来，这三件事这一页压根不用面对——所以它是一个单独的工具，而不是这里的一个按钮。它按这里一贯的规矩来：什么都不上传，摄像头的画面也一帧不留。

### 留白是干什么的，能不能少留点？

二维码周围那圈白不是装饰，是码的一部分。读取器靠它判断这个图形在哪儿结束，规范要求四边各留四个模块，条形码则要十个左右。这里你确实可以把它设成零，画面是清爽了，可相当多的扫描器从此就看不见它了，背景一花更是如此。地方不够，那就把码做小，别去动它的留白。

### 我该用哪种条形码？

扫它的那一方要哪种就用哪种。北美之外的零售条码是 EAN-13，北美是 UPC-A，两者都需要一个由 GS1 发给你的号码，因为那串数字标识的是你的公司，不只是这件商品。EAN-8 是给小包装用的短版本。ITF-14 印在运输纸箱上。Code 128 和 Code 39 除了数字还能装文字，而且完全不用注册，公司内部的东西用它们最合适：固定资产、货架、工单。

### 校验位是什么，工具为什么自己加了一位？

它是零售条码的最后一位，由前面几位算出来，好让扫描器分得清“读错了”和“读对了”。EAN-13 要你给十二位，第十三位它来算；UPC-A 要十一位，第十二位它来算。你打短的，这个页面替你补上；你打全的，它会核对你给的那一位，对不上就拒绝，而不是悄悄改掉。一位数字被悄悄“修正”，等于印出一张扫出来是别人商品的标签。

### 能在二维码中间放个 logo 吗？

小标志有时可行，但无法保证任何图像面积比例都安全。DENSO 所说 H 级约 30% 的恢复率以全部码字为分母，并非任意方块。保留定位和校正图形，使用 H 级，并用多部手机测试最终印刷品。[DENSO 的纠错说明](https://www.qrcode.com/en/about/error_correction.html)解释了这个比例。

### 为什么 SVG 比 PNG 好？

因为码是由边缘构成的，而 PNG 只有固定数量的像素来拼这些边缘。放大一张 PNG，每条边都发虚，而发虚的边正是扫描器最头疼的；给一台 1200 dpi 的打印机一张 512 像素的 PNG，等于让它自己编出那些差别来。SVG 是以指令表达的方块，所以印在名片上和印在广告牌上都一样锐利。这里的 PNG 按每个模块整数个像素画出来，那已经是 PNG 能做到的最好情况。

### 断网能用吗？

能。页面开一次之后断网，它照干不误。这也是证明“什么都没上传”最省事的办法。一个把你的文字送出去画码的工具，拔线那一刻就停了。

## 这条隐私承诺怎么核实

- **处理在这个浏览器里完成。** 本工具在浏览器里处理输入和结果，处理代码不把它们上传去处理。Content-Security-Policy 限制可用资源和连接目的地，但已允许的主机仍可接收请求。策略不检查载荷，不能单独证明什么都没有发出。请把具体操作的请求与源码核对，或断网完成该本地操作。
- **这里没有任何东西会去联网取数据。** 整个 `src/` 里，一个 `fetch`、一个 `XMLHttpRequest`、一个 `sendBeacon` 都找不到。码是靠算术从那串字符里推出来、再画成 SVG 的，就在这个页面里，在你的机器上。
- **这个码不指向我们。** 你打进去什么，码里就装什么。有好几家免费生成器给你的码里装的是通往他们自己网站的链接，再从那儿跳到你这儿。于是每一次扫描都被他们数走，而他们哪天不再续那个域名，或者判定你的免费额度到期了，这个码当天就作废。这里不做短链，不做跳转，也不做统计，页面上显示的那串字符，就是图里的那串。
- **PNG 是拿屏幕上这张 SVG 画出来的。** 下载的不是另外渲染一遍、可能跟预览对不上的第二份。同一份标记交给浏览器，画到画布上，正因如此它也不需要联系任何人：里面没有字体要取，也没有图片要加载。
- **Google 加载了什么，又拿不到什么。** 广告脚本和统计脚本来自 Google，捐助按钮来自 Buy Me a Coffee。你打进去的东西，一个字都没给它们。把一串字符变成一个码的每一行代码，都从本站发出，也都摆在仓库里。
- **断网照样能用。** 断开网络，这个工具跟原来一模一样，因为它本来就没有联网这一步。这是最省事的一条证明。

**你可以自己核对。**上面这些不用你信。这个页面是仓库里的模板和配置生成出来的，构建脚本你能读，也能自己跑一遍，跑出来的结果就提交在 `dist` 分支上。拿实际发给你的内容，跟你自己从源码构建出来的结果对一遍就知道了： https://github.com/A-Box-of-Tools/website

最值得先读的几个文件：`config/site.toml` 里是 Content-Security-Policy，`src/qr-encode.js` 和 `src/qr.js` 里是二维码本身，前者管模式、版本和分块，后者管定位图形、掩码和格式信息位；`src/gf256.js` 里是纠错；`src/barcode.js` 里是那些一条一条的码。
