因為工作的關係,要做日本郵遞區號和地址間的自動補完,還因此開始維護 japan-postal-code-oasis 這個套件,它的前身其實是另外一套叫 japan-postal-code 的,但是它很久沒更新了,所以我就簡單修改一些設計,在研究套件設計的同時就有機會比較深入了解日本的郵遞區號(郵便番号)系統,發現不少有趣的細節,這篇文章特別來紀錄一下。
首先,第一點就是,日本郵遞區號的資料是有整理好並開放下載的,而且下載路徑、檔案格式都是固定的沒什麼變動過,也因此可以找到不少使用這些資料的程式語言套件(包含下載腳本),japan-postal-code 就是透過這份資料來實作從郵遞區號抓地址資訊的功能,雖然不是很想和台灣比,但是這點台灣真的是輸很多,台灣其實到 3+2 郵遞區號都還可以在郵局網站下載的到,但是那個下載連結不是固定的,然後也看不出來是不是固定更新,所以你不會知道你下載的資料是不是最新的,至於最新的 3+3 郵遞區號,就沒有開放大眾下載,取而代之的是提供 Web Service、Windows 應用程式,如果真的要下載資料檔,要特別申請(參照:本公司3+3郵遞區號系統使用規範說明事項),另外就是台灣是一季更新一次,日本則是一個月更新一次。
其實我會注意到日本每個月都更新郵遞區號,是從另外一件事情發現的,在繼續之前,先來介紹一下日本郵遞區號內不同數字的意義,這在日本郵局網站有很詳細的說明,前三碼稱為郵便區番号,後四碼是町域番号,其中的前兩碼是大 block 番号,第三碼則是小 block 番号,基本上都是這樣規劃,理論上不會需要到每個月更新,直到有一天我發現到六本木森大樓,每一層樓都有自己的郵遞區號,例如用 Google Map 搜尋Google Japan (Roppongi Hills)
,然後查看地址就會發現他的郵遞區號是 106-6126,其中的後兩碼就是 26 樓的意思,然後搜尋Apple Japan合同会社
,就會發現郵遞區號是 106-6140,就是 40 樓的意思。後來我才知道,這是屬於 個別番号 之中的超高層大樓番号,除了大樓之外,還有其他種個別番号,像是大型機構(醫院、電視台、公家單位等)也可以申請,而這種個別番号也就是資料內最常會變動的地方,所以他們才有這麼頻繁的資料更新。
其實我還有在一些第三方資料,看到說前三碼的郵便區番号,還可以再更細分成兩組:前兩碼是地域番号,第三碼則是地域調整番号,町域番号的最後一碼則是町域調整番号,另外就是第一版的日本郵遞區號是三碼為主,然後有部分地區有 3+2 碼的設計,網路上還找的到當時(1968、昭和43年)第一版的郵遞區號的清單。
再來印在信封上的,手寫郵遞區號的格子,其實在日本郵局網站上也有仔細的定義它的尺寸,甚至連手寫的字體也有提供範例(基本上就是要你不要寫的太潦草),台灣郵局網站我找到的最接近的就是只有信封書寫範例了,其實日本的規範這麼仔細,有一個原因是為了自動化作業。
這個自動化作業,其實遠超我的預期,不只是根據郵遞區號分類而已,日本郵局其實定義了一套地址的數位化編碼系統,轉換邏輯也不困難,也就是說,日本國內的任意地址,都可以用一串數字(看情況加上英文字母)來表示,日本地址可以簡單的轉為英數編碼,有一個很大的原因是他們的地址是從大範圍(ex: X丁目X番X号)到小範圍這樣,而不像是其他地方用路加上號碼(ex: XX路X號)的方式,所以其實編碼機制也很簡單,大部分的地址,就是郵遞區號加上後面的三碼,然後再加上可能樓層、房號就可以組成,例如東京鳩居堂 銀座本店,地址是:
〒104-0061 東京都中央区銀座5丁目7−4
轉成編碼就是:
10400615-7-4
前七碼固定式郵便番号,所以不用處理分隔符號的問題。
另外日本地址有個天字第一號(我取名的),大家可以猜猜看是哪個地方的地址,沒錯,就是皇居,郵遞區號是 100-0001,地址是 1 丁目 1 番(沒有号),編碼就是:
10000011-1
而且這套編碼系統還有一組專用的 barcode 系統,可以用掃描的方式輸入,非常方便,barcode 的定義也蠻有趣的,不是用粗細,而是用長短和位置來表達不同意義,一條 bar 有四種(4-state)可能的變化(1-4),所以是 2bit,然後一個字元是三條 bar,所以是 6bit,可以有單一字元或是雙字元,理論上單字元有 64 種組合,雙字元是 12bit 共 4096 種組合,不過其實雙字元的第一個字元固定是控制碼,所以實際上變化沒這麼多,目前也只有定義英數、hyphen 和一些控制字元而已,日本郵局內部似乎還有其他用途,而不是只有標記收件人地址而已,不過細節沒有網站上沒有公開,這部份有分為局內 barcode 和 ID barcode,而自己用這組 barcode 系統標注地址的部分,則是稱為 custom barcode。
至於要如何產生住址的 custom barcode 呢,日本郵局網站是有蠻詳細的說明,包括怎樣拆解地址、怎樣編碼、檢查碼怎樣算等等都有說明。而也還有提供一個 custom barcode 產生程式可以下載,抓下來解開後可以發現是網頁應用程式,上一個世代的,編碼也不是 UTF-8 的,現在還可以正常運作,其實還蠻厲害。
PS. 後來發現其實有蠻多國家的郵務系統是使用類似的 4-state barcode 的。
接下來算是不相關的資訊了,其實我在查資料時,有想研究看看郵便番號有沒有和其他標準相似或是共通的地方,首先是有注意到 ISO 3166-2 這個標準,是每個國家自己有一個子集,定義了各自國家的行政區,例如日本的是 ISO 3166-2:JP,裡面就是用 01-47 從北到南把日本的都道府縣編碼了一遍,而且直接對應到 JIS X 0401,最初是在好奇 JIS 的編碼和郵便番号前兩碼的地域番号有沒有相通,結果當然是沒有。其實我還蠻羨慕日本有 JIS 標準統整各種規範的單位,台灣也是有相關的編碼,只是就是像是 ISO 3166-2:TW Wikipedia 條目裡面列出的,就是各單位各自為政這樣。
另外一套標準(?)則是日本導航系統幾乎都會有支援的 MAPCODE,這個編碼系統就不是官方標準了,而是民間企業 日本電装 (前身是 Toyota 自動車的一個部門)開發的定位系統,是針對日本境內的,用類似 quadtree 的方式,把地圖分割成一小塊一小塊,然後每一塊下去編碼,不過和 quadtree 不一樣的是,不是統一分成四塊,而是分成三個層級,第一級是 Zone 全日本被分為 1203 個 Zone,然後每個 Zone 再細分成 30x30 個 Block,每個 Block 一樣再細分成 30x30 個 Unit,如果還要更細,還可以再細分成 Core 和 S Core,大約可以到 3 公尺的精細度,最後就是當然,這套系統的大分區也和郵遞區號完全不相通。