有些名片、簡報最後一頁或活動識別證上會印一個 QR Code,手機相機對準它,畫面就跳出「新增聯絡人」,姓名、電話、Email 一次填好。這個效果不需要什麼特殊服務,背後只是一段叫做 vCard 的純文字,被編碼進 QR Code 而已。

整個流程只有兩步:

  1. 寫一段 vCard 文字(也可以存成 .vcf 檔)。
  2. 把這段文字原封不動轉成 QR Code 圖檔。

下面依序說明。文中所有姓名、電話、Email 都是示範用的假資料,example.com 是網路標準保留給範例用的網域。

vCard 是什麼

vCard 是交換「電子名片」的標準格式,規格由網際網路工程任務組(IETF)以 RFC 文件發布。常見的有兩個版本:

版本 規格文件 發布時間 現況
3.0 RFC 2426 1998 年 9 月 已被 RFC 6350 取代,但仍廣泛使用
4.0 RFC 6350 2011 年 8 月 目前的標準版本

RFC 6350 登記的副檔名是 .vcf 與 .vcard,媒體類型是 text/vcard。從手機或電腦通訊錄「分享聯絡人」匯出的檔案,通常就是 .vcf。

一份 vCard 以 BEGIN:VCARD 開頭、END:VCARD 結尾,中間每一行是一個欄位,格式是「欄位名稱:內容」,必要時在欄位名稱後面用分號加上參數。

一份 vCard 3.0 範例

BEGIN:VCARD
VERSION:3.0
N:王;大明;;;
FN:王大明
ORG:範例股份有限公司
TITLE:業務經理
TEL;TYPE=WORK,VOICE:+886-2-1234-5678
EMAIL;TYPE=INTERNET:daming@example.com
URL:https://example.com
END:VCARD

逐行說明:

  • VERSION:3.0:宣告版本,3.0 規格要求這一行的值必須是「3.0」。
  • N:王;大明;;;:結構化姓名,用分號分成五格,依序是「姓;名;其他名字;前置稱謂;後置稱謂」,用不到的格子留空但分號要保留。
  • FN:王大明:顯示用的完整姓名,也就是通訊錄列表上看到的名字。
  • ORG、TITLE:公司與職稱。
  • TEL;TYPE=WORK,VOICE::電話,TYPE 參數標示類型,例如 WORK(公司)、HOME(住家)、CELL(行動電話)、FAX(傳真);寫成 +886 開頭的國際格式,在國外掃描也能直接撥。
  • EMAIL、URL:電子郵件與網站。

如果要放地址,欄位是 ADR,同樣用分號分成七格:郵政信箱;延伸地址;街道;城市;行政區或州;郵遞區號;國家。RFC 6350 建議前兩格(郵政信箱、延伸地址)留空以提高相容性。不過要不要放地址,後面「個資」一節會再談。

3.0 和 4.0 差在哪

同一張名片寫成 4.0 版大概是這樣:

BEGIN:VCARD
VERSION:4.0
FN:王大明
N:王;大明;;;
ORG:範例股份有限公司
TITLE:業務經理
TEL;VALUE=uri;TYPE="work,voice":tel:+886-2-1234-5678
EMAIL;TYPE=work:daming@example.com
URL:https://example.com
END:VCARD

主要差異整理如下:

項目 vCard 3.0(RFC 2426) vCard 4.0(RFC 6350)
必要欄位 VERSION、N、FN 三個都必須有 只有 VERSION、FN 必須有,N 改為「建議要有」
字元編碼 由外層的傳輸環境指定字元集,規格只說 UTF-8 較佳 一律 UTF-8,不能改用其他編碼
電話寫法 TEL;TYPE=CELL:號碼 建議寫成 URI:TEL;VALUE=uri;TYPE=cell:tel:號碼
規格狀態 已被取代 現行標準

對自製名片來說,最有感的是編碼:4.0 明訂 UTF-8,中文姓名、公司名稱比較不會出現亂碼。但新版本不代表每個裝置都讀得順,舊型手機或某些通訊錄軟體對 4.0 的支援程度不一。兩個版本都可以用,實務上最可靠的做法是:做好之後,拿手邊的 iPhone 和 Android 手機各掃一次,確認姓名、電話、中文字都正確,再拿去印。

常見的格式地雷

vCard 是很「死板」的純文字格式,下面幾個問題最常讓 QR Code 掃得出來、卻存不進聯絡人:

  • 冒號、分號要用半形:中文輸入法打出來的全形冒號「:」不會被當成分隔符號,整行會被忽略或判讀錯誤。
  • 不要用 Word 之類的文書軟體編輯:它可能自動把引號換成彎引號、合併或改變換行,讓格式壞掉。用系統內建的純文字編輯器(記事本、TextEdit 的純文字模式)或程式編輯器即可。
  • 內容裡有逗號、分號、反斜線要跳脫:例如公司名稱裡有逗號,要寫成 \,;分號寫成 \;;反斜線寫成 \\。
  • 換行:規格要求每一行用 CRLF(Windows 式換行)結尾,長行建議在 75 個位元組處折行。多數軟體對只用 LF 的檔案也讀得懂,但如果某台裝置讀不出來,換行格式是值得檢查的地方。
  • BEGIN 和 END 要成對:漏掉 END:VCARD,有些掃描程式會直接當成一般文字處理。

把 vCard 轉成 QR Code

QR Code 本身只是一種「裝資料的容器」,把上面那段文字整段編碼進去,手機掃到開頭是 BEGIN:VCARD 的內容,就會辨識成聯絡人。

產生 QR Code 的工具很多,網路上的線上產生器也到處都是。不過要記得,把 vCard 貼進某個網站,等於把這些個資交給對方的伺服器處理;有些服務產生的還是「動態 QR Code」,圖上其實是一個導向對方網站的短網址,哪天服務收費或關站,印出去的碼就失效。比較穩妥的原則是:

  • 優先用離線或開源的工具,讓資料留在自己的電腦。
  • 確認產生的是「靜態」QR Code:vCard 內容直接寫在圖裡,不經過任何第三方網址。

以開源的 libqrencode 為例,它附帶一個命令列工具 qrencode,可以直接讀取檔案產生圖片:

qrencode -r card.vcf -l M -o card.png
qrencode -r card.vcf -l M -t SVG -o card.svg
  • -r card.vcf:從檔案讀取要編碼的內容。
  • -l M:容錯等級。
  • -o:輸出檔名;-t SVG 輸出向量圖,印刷時放大也不會糊。

QR Code 有 L、M、Q、H 四種容錯等級,等級越高,污損時能還原的比例越高(大約從 7% 到 30%),但同樣的內容會產生更密、更大的碼。依 QR Code 發明者 DENSO WAVE 的說明,一般最常選的是 M 級(約 15%)。

另外兩個實用原則:

  • 欄位越少,碼越好掃:中文字在 UTF-8 裡每個字佔 3 個位元組,欄位一多,QR Code 的格子就變得又小又密,印在名片這種小尺寸上容易掃不到。只放真正需要的欄位。
  • 四周留白:QR Code 周圍要保留一圈空白(qrencode 預設會留),不要讓邊框或文字貼著它。

印出去之前:QR Code 等於公開這些個資

這是最容易被忽略的一點。QR Code 不是加密,任何人拿手機一掃,就能讀出裡面每一個欄位,而且一旦印出去、發出去,就沒辦法收回。名片可能被轉交、被拍照上傳,簡報檔會被轉寄,海報會被路人拍下來。

所以在決定放哪些欄位之前,先想一下「如果這張圖被公開在網路上,我能接受嗎?」:

  • 對外用的名片碼,只放本來就公開的聯絡方式:公司電話、公務 Email、公司網站。
  • 私人手機、住家地址、生日這類欄位不要放,真的需要,再當面另外交換。
  • 不同用途做不同的碼:給客戶的、給活動參加者的、給熟人的,內容可以不一樣。
  • 資料變更要重印:靜態 QR Code 的內容寫死在圖裡,換工作、換電話之後,舊名片上的碼就會一直流傳舊資料。

小結

  • vCard 是一段純文字,3.0 版必須有 VERSION、N、FN,4.0 版必須有 VERSION、FN,且一律使用 UTF-8。
  • 用半形符號、純文字編輯器,特殊字元記得跳脫。
  • 用離線或開源工具產生靜態 QR Code,容錯等級選 M 通常就夠。
  • 做好後用不同手機實際掃描測試。
  • 只放願意公開的欄位,因為 QR Code 等於把裡面的資料印成一張任何人都讀得到的圖。

參考資料