UPC-A 編碼規則
- 11 位數字 + 1 位檢查碼 = 12 位
- 左半邊 6 位用 L 編碼(奇校驗),右半邊 6 位用 R 編碼(偶校驗)
- 起始/中間/結束護衛條:
101、01010、101
完整生成函數
<?php
function generateUPCA($code) {
// 1. 輸入驗證
if (strlen($code) !== 11 || !ctype_digit($code)) {
die('UPC-A 必須為 11 位數字');
}
// 2. 計算檢查碼 (EAN-13 算法)
$ncode = '0' . $code; // 前補 0 擴充為 EAN-13
$even = $odd = 0;
for ($i = 0; $i < 12; $i++) {
($i % 2 === 0) ? $even += $ncode[$i] : $odd += $ncode[$i];
}
$check = (10 - (($odd * 3 + $even) % 10)) % 10;
$fullCode = $code . $check; // 12 位完整碼
// 3. 編碼表
$L = ['0001101','0011001','0010011','0111101','0100011',
'0110001','0101111','0111011','0110111','0001011'];
$R = ['1110010','1100110','1101100','1000010','1011100',
'1001110','1010000','1000100','1001000','1110100'];
$guard = ['101', '01010', '101']; // 左、中、右
// 4. 組合二進位條碼字串
$bars = $guard[0]; // 左護衛
$bars .= $L[$fullCode[0]]; // 第1位用L碼
for ($i=1; $i<6; $i++) $bars .= $L[$fullCode[$i]]; // 第2-6位
$bars .= $guard[1]; // 中護衛
for ($i=6; $i<12; $i++) $bars .= $R[$fullCode[$i]]; // 第7-12位用R碼
$bars .= $guard[2]; // 右護衛
// 5. GD 繪圖
$lw = 2; $hi = 100; // 條寬、條高
$img = imagecreate($lw * 95 + 30, $hi + 30);
$fg = imagecolorallocate($img, 0, 0, 0);
$bg = imagecolorallocate($img, 255, 255, 255);
imagefilledrectangle($img, 0, 0, imagesx($img), imagesy($img), $bg);
// 繪製條碼
for ($x = 0; $x < strlen($bars); $x++) {
$sh = (($x < 10) || ($x >= 45 && $x < 50) || ($x >= 85)) ? 10 : 0; // 護衛條下延
$color = ($bars[$x] === '1') ? $fg : $bg;
imagefilledrectangle($img, $x*$lw+15, 5, ($x+1)*$lw+14, $hi+5+$sh, $color);
}
// 繪製人工可讀數字
imagestring($img, 4, 5, $hi-5, $fullCode[0], $fg); // 首位左側
for ($i=0; $i<5; $i++) {
imagestring($img, 5, $lw*(13+$i*6)+15, $hi+5, $fullCode[$i+1], $fg); // 左組
imagestring($img, 5, $lw*(53+$i*6)+15, $hi+5, $fullCode[$i+6], $fg); // 右組
}
imagestring($img, 4, $lw*95+17, $hi-5, $fullCode[11], $fg); // 檢查碼右側
// 6. 輸出
header('Content-Type: image/png');
imagepng($img);
imagedestroy($img);
}
// 使用範例
generateUPCA('12345678901');
?>
應用場景
- 商品標籤列印
- 庫存管理系統條碼生成
- 線上訂單電子憑證
- 測試掃描槍識別率
擴充建議
- 支援 EAN-13、Code 128、QR Code 等更多制碼
- 輸出 SVG 矢量格式(適合列印),使用
barcode-bakery 等成熟庫
- 批次生成 ZIP 打包下載