選單

地址驗證與正規化差在哪?各自能做與不能做的事

地址驗證與正規化經常被當成同一件事,其實一個在問「這筆資料合不合理」,另一個在整理「這筆資料該長什麼樣」。本文說明兩者的界線、為什麼沒有全球地址總庫,以及錯誤訊息該怎麼分類。

發佈於

  • 測試資料
  • 地址

地址驗證與正規化常被混在一起講,但它們回答的是不同問題:一個在問這筆資料合不合理,另一個在整理這筆資料該長什麼樣子。分不清這兩件事,就會寫出既擋掉正確輸入、又放過明顯錯誤的規則。以下說明各自的邊界,以及跨國情境下實際能期待到什麼程度。

正規化與驗證是兩件事

正規化是把同一筆資料的多種寫法收斂成一致的形式,例如統一大小寫、去掉多餘空白、把全角字轉成半角。它的目的是讓比對變得可行,本身不判斷對錯,也不會拒絕任何輸入。

驗證則是在判斷這筆資料是否符合規則,可能拒絕它、標記它,或只是留下一個警示。它可以建立在正規化之後的結果上,但兩者的輸出必須分開保存。

把兩者混在同一步驟裡,最常見的後果是:使用者輸入的原始內容被覆蓋,事後無法還原他到底填了什麼;同時,錯誤訊息也變得模糊,因為系統不知道自己是「改了」還是「判定不合法」。

為什麼沒有全球地址總庫?

因為地址不是由政府統一發放的識別碼,而是各地郵政與行政體系的產物。每個國家有自己的層級、自己的命名方式、自己的更新節奏,也沒有一個機構負責彙整全世界的門牌清單。

所以任何號稱能驗證全世界地址的服務,實際上都是各國資料的拼湊,覆蓋率與更新時間都不一致。對開發者來說,重點是知道自己手上那份資料涵蓋哪些國家、多久更新一次,而不是相信某個通用的判斷。

這個現實也決定了驗證的定位:它只能確認「這筆資料看起來符合該國規則」,沒辦法確認「這個門牌真的存在」。想做後者,只能依賴該國的權威來源,而且通常要付費或另有授權限制。

若你採用外部服務,值得在文件裡先寫清楚三件事:涵蓋哪些國家、多久更新一次、查不到時的行為是什麼。這三件事決定了出問題時你有多少線索可查,也決定了你能不能對使用者解釋為什麼這筆地址被標記。

驗證失敗就代表地址寫錯了嗎?

不一定。規則太嚴會擋掉合法寫法,例如把少見但正確的格式判成錯誤,或是以為某國一定有某一層欄位。反過來說,規則太鬆則會讓明顯錯誤通過。

比較務實的做法是把失敗分成幾類:格式不符、欄位互相矛盾、查無對應資料。這三類的嚴重程度不同,處理方式也不同。格式不符通常可以讓使用者當場修正;欄位矛盾需要提示他哪兩個欄位對不上;查無資料則可能只是你的資料庫沒涵蓋那個地區,不該直接說使用者在說謊。

如果只有一個籠統的「地址錯誤」,使用者只能反覆猜測,最後往往改成填一個看起來能通過的值,反而讓資料品質更差。

規則版本也要能被追溯。當你把某條限制放寬或收緊,應該留下日期與原因,否則半年後沒有人說得出某批資料當時為何通過、現在又為何失敗。這種解釋能力在客服與稽核情境下特別重要。

正規化會動到哪些內容?

常見的動作包括統一大小寫、壓縮多餘空白、把標點符號統一、把數字轉成一致的寫法、以及在保留原始值的前提下產生一份比對用的字串。這些動作多半是安全的,因為它們不改變語意。

需要小心的是那些會改變語意的處理,例如把樓層與單元號合併、把兩個欄位串接後再切開、或是因為長度限制而截斷內容。截斷尤其危險:它會產生一筆看起來正常、實際上少了一段資訊的地址,而且沒有任何錯誤訊息。

郵遞區號是最容易在正規化過程中受傷的一項,開頭的零被當成整數處理後就會消失,這件事在各國郵遞區號格式裡有較完整的說明。美國的州與郵遞區號交叉檢查則是另一種常見的驗證,細節見美國地址格式。

兩份結果為什麼要分開存放?

因為它們的用途不同。原始值是使用者送來的內容,是事實;正規化值是為了比對而產生的,是衍生物。若只留後者,等於放棄了還原能力,日後要釐清爭議時會非常被動。

分開存放也讓規則可以改。當你把正規化邏輯升級時,只需要重新產生衍生的那一份,原始值不受影響。若兩者混在一起,每次調整規則都等於改寫歷史資料。

驗證結果同樣建議獨立記錄,包含判定時間與規則版本。這樣才能解釋為什麼同一筆地址在半年前通過、現在卻被標記,而不是把它當成使用者改了資料。

實作上常見的安排是三份資料並存:使用者送來的原始輸入、比對用的正規化值、以及驗證的判定結果。三者各有用途,也各有生命週期,混在一起之後任何一方要調整都會牽動其他兩方。

正規化前後的比對要怎麼驗證?

正規化最容易出的問題是它不穩定:同一筆輸入跑兩次得到不同結果,或在流程裡被套用了兩次而改變內容。要驗證這件事,可以把同一批樣本連續跑兩次,確認兩次的輸出完全一致。

另一種情況是重複套用:把已經正規化的值再正規化一次,結果應該與第一次相同。若第二次又改變了內容,代表規則裡藏著會累積的動作,例如反覆壓縮空白或不斷轉換標點。

還有一種常見疏漏是把正規化值當成原始值再處理,例如先寫回資料庫再讀出來做第二次比對。這種做法讓問題很難察覺,因為每一步看起來都正確。比較安全的安排是確認整條流程裡只有一個地方負責產生正規化值,其餘地方只讀取它。

給開發者:把失敗原因分類

  • 格式、矛盾、查無資料要分成不同類型,訊息也要不同。
  • 正規化只產生衍生的比對值,永遠保留原始輸入。
  • 驗證規則要能依國家切換,並且可更新、可追溯版本。
  • 超出涵蓋範圍時要回報「無法判斷」,而不是「錯誤」。
  • 測試資料要涵蓋合法但罕見的寫法,才驗得出規則過嚴。
  • 正規化邏輯與驗證規則各自記錄版本,方便回推判定原因。

本站的隨機地址產生器產生的地址只供測試,不能投遞,但它的欄位彼此一致、格式符合該國慣例,因此很適合用來檢查規則會不會誤擋合法輸入。要處理國家與行政區代碼的合法性,可以接著讀ISO 國家與行政區代碼。

下一步

拿你現行的驗證規則跑一批合法但罕見的寫法,看看有多少被誤判;再挑一筆明顯矛盾的地址,確認系統給的提示能不能指出問題在哪。要把這些樣本整理成可重複使用的資產,讀測試固定裝置裡的地址資料。

繼續閱讀

隨機地址產生器相關文章