# QR Code 與條碼 離線產生 QR Code 和條碼

打進去，就變成一個碼。產生過程不往外送任何東西。

> 產生連結、Wi-Fi 或者名片 QR Code，也產生 EAN-13、UPC-A、Code 128 和 Code 39 條碼。可下載 SVG 或 PNG。全部在你的瀏覽器裡完成。

本頁是一個完全在你的瀏覽器裡執行的互動式工具，地址是 https://abox.tools/zh-TW/qr-barcode/。你交給它的任何內容都不會被上傳。下面是這個頁面用文字對該工具的全部說明；要使用它，請開啟這個地址。

## 你的碼和碼裡的文字**不會上傳**。這裡根本沒有伺服器。

QR Code 不過是對一串字元做算術，沒有檔案要送，也沒有服務要求人。選模式、定版本、算裡德所羅門糾錯、挑掩碼、排條碼的粗細條、算下面那位校驗碼，每一步都發生在這個頁面裡，一千來行你能讀的 JavaScript。這個工具沒有任何聯網功能。這一條在這裡比在別的頁面更要緊，因為被編進碼裡的，常常是一個 Wi-Fi 密碼。

- ✗ 不上傳
- ✗ 不註冊
- ✗ 不過期
- ✓ 斷網能用
- ✓ 開源

## 不上傳怎麼產生 QR Code

1. **先挑碼的種類。** QR Code 什麼都裝得下，也是手機鏡頭預設要找的東西，所以除非有人另有要求，答案就是它。條碼裝的是一串數字，具體要哪一種，由將來掃它的那一方說了算：商店要 EAN-13 或者 UPC-A，運輸紙箱要 ITF-14，公司內部用的一般是 Code 128。
2. **說清楚碼裡裝什麼。** 最常見的是一個連結，上面那幾個表單則負責拼出手機認得的其他格式：一個能自動加入的 Wi-Fi、一張能提示儲存的名片、一封郵件、一條簡訊、一個電話號碼、一個地圖位置。不管你選哪個，拼好的那串字元都會顯示在頁面上，因為QR Code 裡裝的從來就只有它。
3. **決定它能挨多少損傷。** 四個等級放進去的糾錯資料一檔比一檔多，而糾錯越多，碼就越大越密。螢幕上看 L 就夠，普通紙張用 M，要被反覆摸、印得很小、或者貼在曬得到太陽的櫥窗上，用 H。選單上那種每天要擦一遍的碼，值得上 Q 或者 H。
4. **定尺寸、留白和顏色。** 留白是碼的一部分。規範要求四邊各留四個模組的空白，把它裁掉，是印出來的碼掃不出來最常見的單一原因。深色在淺色上，而且對比要真夠：讀取器量的是兩者之差，所以白底淺灰不行，淺色在深底上更是有相當多的讀取器直接不認。
5. **拿你手上這部手機試一下。** 印一千份之前，先掃螢幕上這個。十秒鐘的事，卻能擋住一整類預覽看不出來的毛病：Wi-Fi 密碼裡有個字元本該轉義、連結漏了 `https://`、條碼數字少了一位。
6. **拿 SVG。** 它是以指令表達的碼，不是一堆畫素，所以印多大都不發虛，而發虛的邊緣正是掃描器最分辨不了的東西。你要貼進去的地方要是不認 SVG，那就順手也拿上 PNG，它按每個模組整數個畫素畫出來，同樣沒有糊掉的邊。

## 說得更細的版本

[怎麼做一個到了別人手機上還掃得出來的 QR Code](https://abox.tools/zh-TW/guides/make-a-qr-code/): 糾錯等級該選哪個，QR Code 周圍那圈白為什麼是碼的一部分，印多大合適，還有免費產生器的「動態碼」日後要你付出什麼。

## 工具箱裡還有

- [QR Code 與條碼識讀](https://abox.tools/zh-TW/qr-barcode-reader/): 把鏡頭對準碼，或者把拍下來的圖丟進來。讀這件事只發生在這裡，別處都沒有。
- [雜湊與校驗和](https://abox.tools/zh-TW/hash-checksum/): 把下載來的檔案和釋出方公佈的那串數字對一下，不用把它發給任何人。
- [密碼與密碼短語產生器](https://abox.tools/zh-TW/password-generator/): 在這裡產生，由你自己的瀏覽器產生，不發往任何地方。什麼都不儲存，也沒有歷史記錄。
- [JSON 格式化](https://abox.tools/zh-TW/json-formatter/): JSON、XML、HTML、CSS 和 YAML，格式化或轉換。沒有一個字被貼進別人的伺服器。

## 常見問題

### 我打進去的東西會被髮到什麼地方嗎？

不會。QR Code 就是對一串字元做算術，而這套算術在你自己的瀏覽器裡、你自己的機器上跑。這個工具沒有任何聯網功能，不取東西，也不發東西。頁面的 `Content-Security-Policy` 把它可能聯的地址全列了出來，沒有一個是本站的。這一點在這裡比在別的頁面更值錢，因為人們最常塞進QR Code 的，就是自家 Wi-Fi 的密碼。

### 這些碼會過期嗎？會哪天突然失效嗎？

不會，也不可能。你打進去什麼，碼裡就裝什麼，掃出來永遠是那串字元。會過期的是那種裡面裝著別人地址的碼：所謂「動態」QR Code，裝的是通往產生方伺服器的連結，再由那邊跳到你這裡。於是他們能數走每一次掃描，能改目的地，也能在試用期結束那天把它關掉。這裡沒有任何東西經別人中轉。

### 免費嗎？能商用嗎？

免費，沒有帳號，沒有水印，產生多少個都不限，結果放到產品上、海報上、店面上都行。QR Code 是電裝（Denso Wave）的註冊商標，他們公開表示不會對使用這種碼的人主張這項商標，規範以 ISO/IEC 18004 公開發布，任何人都可以自由實現，這個頁面做的就是這件事。本站帶廣告，經費就是這麼來的。

### 糾錯等級該選哪個？

沒有特別理由就選 M。L 產生的碼最小，螢幕上完全夠用；M 扛得住日常翻動；Q 和 H 留給那些要印得很小、要過塑、要貼櫥窗、或者中間會被 logo 蓋住一塊的碼。每往上一檔，塞進去的校驗資料就多一些，同樣多的文字就需要一個更大的圖形，從 L 換到 H，同一串字元的模組數大約要翻一倍。

### 一個 QR Code 能裝多少東西？

最大那一檔是 ⁦177 × 177⁩ 個模組，最多裝 7089 位數字、4296 個大寫字母和數字，或者 2953 位元組的其他內容，而這還是在最弱糾錯下的數字，最強糾錯大約只有三分之一。實際上卡住你的不是格式，是掃描器：過了幾百個字元，模組就小到普通手機鏡頭在一臂之外分辨不出來了。碼一長，通常說明裡面該換成一個短連結。

### 連結改成小寫，碼怎麼反而變大了？

因為 QR Code 有一種專門裝大寫字母和數字的模式，兩個字元壓進十一位；小寫沒有這種模式，一個字元要八位。同一個網址寫成 `HTTPS://EXAMPLE.COM/PAGE`，可以比小寫版本小三分之一。協議名和主機名本來就不區分大小寫，喊成大寫除了變小什麼都不影響；主機後面那段路徑可是區分的，別去動它。

### 它能掃碼嗎，還是只能產生？

這一頁做不到，隔壁那頁可以：[識讀工具](https://abox.tools/zh-TW/qr-barcode-reader/)接一張照片、一張截圖或者你的鏡頭，把裡面那串字元還給你。這比畫一個碼大得多——在一張圖裡找出那個圖形、把拍攝角度糾正回來、再把破損的地方修回來，這三件事這一頁壓根不用面對——所以它是一個單獨的工具，而不是這裡的一個按鈕。它按這裡一貫的規矩來：什麼都不上傳，鏡頭的畫面也一幀不留。

### 留白是做什麼的，能不能少留點？

QR Code 周圍那圈白不是裝飾，是碼的一部分。讀取器靠它判斷這個圖形在哪裡結束，規範要求四邊各留四個模組，條碼則要十個左右。這裡你確實可以把它設成零，畫面是清爽了，可相當多的掃描器從此就看不見它了，背景一花更是如此。地方不夠，那就把碼做小，別去動它的留白。

### 我該用哪種條碼？

掃它的那一方要哪種就用哪種。北美之外的零售條碼是 EAN-13，北美是 UPC-A，兩者都需要一個由 GS1 發給你的號碼，因為那串數字標識的是你的公司，不只是這件商品。EAN-8 是給小包裝用的短版本。ITF-14 印在運輸紙箱上。Code 128 和 Code 39 除了數字還能裝文字，而且完全不用註冊，公司內部的東西用它們最合適：固定資產、貨架、工單。

### 校驗位是什麼，工具為什麼自己加了一位？

它是零售條碼的最後一位，由前面幾位算出來，好讓掃描器分得清「讀錯了」和「讀對了」。EAN-13 要你給十二位，第十三位它來算；UPC-A 要十一位，第十二位它來算。你打短的，這個頁面替你補上；你打全的，它會核對你給的那一位，對不上就拒絕，而不是悄悄改掉。一位數字被悄悄「修正」，等於印出一張掃出來是別人商品的標籤。

### 能在 QR Code 中間放個 logo 嗎？

這裡不行，但別處為什麼行，值得知道：靠的正是糾錯。H 級下大約 30% 的模組被毀掉，碼依然讀得出來，所以一個蓋住比這少一些、又正好落在中間那塊沒有定點陣圖形的地方的 logo，屬於能被修回來的損傷。做法是：用 H 級產生，拿到你的影像軟體裡去蓋，logo 控制在面積的五分之一以內，然後拿真手機測，別憑感覺信它。

### 為什麼 SVG 比 PNG 好？

因為碼是由邊緣構成的，而 PNG 只有固定數量的畫素來拼這些邊緣。放大一張 PNG，每條邊都發虛，而發虛的邊正是掃描器最頭疼的；給一臺 1200 dpi 的印表機一張 512 畫素的 PNG，等於讓它自己編出那些差別來。SVG 是以指令表達的方塊，所以印在名片上和印在廣告牌上都一樣銳利。這裡的 PNG 按每個模組整數個畫素畫出來，那已經是 PNG 能做到的最好情況。

### 斷網能用嗎？

能。頁面開一次之後斷網，它照常運作。這也是證明「什麼都沒上傳」最省事的辦法。一個把你的文字送出去畫碼的工具，拔線那一刻就停了。

## 這條隱私承諾怎麼核實

- **你打進去的東西沒地方可去。** Content-Security-Policy 把這個頁面允許聯的地址全列了出來，沒有一個是本站的。這裡沒有能收 Wi-Fi 密碼的介面，程式碼裡也沒有一行會把它發出去，就算真有那麼個介面也一樣。
- **這裡沒有任何東西會去聯網取資料。** 整個 `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` 裡是 QR Code 本身，前者管模式、版本和分塊，後者管定點陣圖形、掩碼和格式資訊位；`src/gf256.js` 裡是糾錯；`src/barcode.js` 裡是那些一條一條的碼。
