条形码
Code128、EAN-13 与 UPC-A 自写编码,校验位算好并画出可读文字。
这一页自己手写编码器,做了三种码:Code 128、EAN-13 与 UPC-A,没有引入任何条码库(运行时依赖里只有 astro、sitemap 与 js-yaml),也没有任何请求发出去——输入只在浏览器内存里变成一串条空宽度,再拼成 SVG 或光栅成 PNG。Code 128 支持三个字符集与自动选集,自动模式固定采用「从当前位置起连续数字达到 4 位就切到 Code C」这条规则,并在界面上写明;EAN-13 与 UPC-A 用同一套 GS1 加权法算校验位,Code 128 则是模 103 的加代和,校验码字一定被编进条码里。
没做的码写在这里:交插 25 码(ITF-14)没有做——它的宽窄条表在本次开发里没能在公开来源上逐条核对完整,宁可整块跳过也不给半套,页面与这里都如实写明;UPC-E、带扩展码(2/5 位)的 EAN、以及 GS1-128 需要的 FNC1 与 Application Identifiers 语义同样没有实现。各家资料在 ≥4 与 ≥6 之间并不一致,这里只承诺自己这一条切 C 的规则。输入完整位数时逐位核对,不符就把「末位是 X、按加权应为 Y、完整号码是 …」一并报出来,绝不画一张扫出来是别的号码的图;强制单集时遇到该集表示不了的字符会直接报错,并说清这个字符需要哪个集。屏幕上的毫米数受 DPI 与系统缩放影响,按 100% 打印下载的 SVG 才是这套尺寸。
条形码怎么用
- 选码制再填载荷:Code 128 可写任意 ASCII 文本(含中文以外的符号),码集选「自动」或强制 A/B/C;EAN-13 填 12 或 13 位数字、UPC-A 填 11 或 12 位数字。首尾空白会被去掉并显示在提示条里;数字中间的分隔空格(400 6381 3339 31 这种贴法)也会被吃掉并说明。
- 对图案与算式:预览卡底下两块默认收起的折叠是「模块宽度序列」与「编码细节与校验算式」:前者是从条开始、条空交替的逐个数字(整段可选中对照,标题旁跟着报出 N 个元素 · M 模块),后者列码集轨迹、码字值序列、校验位怎么算出来的、模块数账目与含空白区的总宽(EAN/UPC 另有逐位加权展开式与 95 模块结构)。空白区 Code 128 默认 10 模块、EAN/UPC 默认 11 模块且两侧同值,取的是不小于任何单侧最小要求的保守做法。预览卡底下还按所选窄模块宽度给出毫米数:符号宽、含空白区的总宽,以及图面像素按同一缩放折算的长宽。可读文字按真实版面排:数据位落在各自 7 模块的中心,护条与中线向下延伸出文字带,首位在左护条外侧高于左组那一行、末位在右护条外侧与右组同基线。
- 取图与打印:模块宽(px)与高度可调,导出走 Blob + anchor 下载 SVG 或 PNG,本页没有复制按钮也没有上传。要按真实尺寸印:把窄模块宽度按 mm 填进输入框,用 SVG 打印(矢量),并在打印机驱动里关掉「缩放以适应页面」——PNG 是位图,放大就会糊。
- Code 128 的三个字符集:A 集覆盖 ASCII 0–95(也就是控制字符到下划线),B 集覆盖 ASCII 32–127(含全部小写字母),C 集把数字按两位一组压成 00–99;起始符分别是 103/104/105,码集中途切换用 99(C)、100(B)、101(A)。若某段连续数字长度为奇数,起始段会直接以 START C 起步、末尾剩的一位退回字母集,中途段则先用当前字母集编一位再进 C,这样比「进 C 再退出来编那一位」少一个切换码字。也可以强制单集:此时遇到该集表示不了的字符(例如强制 B 却来了制表符,或强制 A 却来了小写字母)会直接报错,并说清这个字符需要哪个集。
- 校验位是怎么算出来的:Code 128 是模 103 的加代和:起始符的值按权 1 计入,其后每个码字乘以它在序列里的位置(第一个数据码字乘 1,第二个乘 2…),全部相加后对 103 取余,余数就是校验码字;按 Code 128 的惯例它不印在可读文字中,页面默认隐藏、可用开关带上(校验值 ≥96 时没有对应字符,就照实写出数值而不是硬凑一个假字符)。EAN-13 与 UPC-A 用同一套 GS1 加权法:数据位从最右边一位开始按 3、1、3、1…交替加权(校验位自己的权是 1,所以参与计算的最右数据位权 3),求和后取「还差多少凑到 10 的倍数」,即 (10 − 和的个位) mod 10。输入 12 位(EAN-13)或 11 位(UPC-A)时本页算出校验位并追加。
常见问题
为什么把条码号码贴进表格再导出,画出来就错了?
前导零被吃掉了。0075678164125 贴进电子表格会被当数字存成 75678164125(少两位零),长度与校验位双双变形,条码扫出来是另一个商品。本页从头到尾把载荷当字符串处理,绝不做数值转换:输入以 0 开头就照 0 开头编码,位数不够会明确报「需要 12 位或 13 位,实际收到 N 位」,而不是悄悄补零。反过来,如果你的号码是别人给的表格截图,先确认那几个前导零还在不在。
Code 128 能当 GS1-128 用吗?校验位算对了是不是就合法了?
不能等价。Code 128 编码的是「一串字符」,它不知道哪一段是 AI(Application Identifier)、哪一段是数据,GS1-128 需要的 FNC1 分隔与 AI 结构本页没有实现,所以画出来的图不会被当成带结构化字段的物流标签。同样,校验位算对只说明这串数字内部自洽,不代表这个公司前缀或 GTIN 经过 GS1 正式分配——本页只画图案、算校验位,无法也不声明号码的注册有效性。真要投产,请以 GS1 规范与扫码实测为准。
屏幕上的条码看着比算出来的毫米数宽/窄,为什么?
因为屏幕毫米数不是物理量。页面用「窄模块宽度 mm × 模块总数」算出的是印刷尺寸(例如 EAN-13 的 95 模块在 0.33mm 窄模块下是 31.35mm,正好是规范版面宽度),但显示器按 DPI 与系统缩放把 CSS 像素换算成物理长度,同一张图在不同屏幕上量出来的实际毫米数会差很多。要可控尺寸只有两条路:下载 SVG 按 100% 打印,或把窄模块宽度按毫米填好、用模块数反推印刷缩放。另外别在条码上叠透明度、内阴影或渐变,条空对比度低于要求就扫不出来。
两种码各有多宽、模块是怎么数出来的?
Code 128 每个码字由 3 条 3 空共 6 个元素组成、合计 11 个模块,终止符是唯一的例外:2331112 共 7 个元素、13 个模块,所以整码宽度是 11×(起始+数据+切换+校验) + 13。EAN-13 与 UPC-A 恒为 95 模块:左护条 101(3)+ 左半 6 位×7 + 中线 01010(5)+ 右半 6 位×7 + 右护条 101(3)。这两条算式和完整的条空宽度序列(例如 211232112232…)都在预览卡底下折成可展开的文本,点开就能与参考资料逐位对照。
EAN-13 的左右两半为什么长得不一样?UPC-A 又是什么?
左半那 6 位用 L 表还是 G 表,由首位数字选出的 10 种奇偶排列指定(0 全 L、1 是 LLGLGG……9 是 LGGLGL),首位本身不画条空、只靠这个排列表达,右半恒为 R 表。UPC-A 就是首位补 0 的 EAN-13,符号串完全相同,区别只在可读文字只印 12 位、数制位悬在左护条外侧。
对应功能编号 #77无需安装,手机端同样可用按 Ctrl + K 换工具