vehicles 0.6.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +164 -0
- data/CHANGELOG.md +274 -0
- data/README.md +55 -10
- data/data/PROVENANCE-vehicles.md +12 -0
- data/data/plates/PROVENANCE.md +5 -4
- data/data/plates/_decode/at-districts.yml +287 -0
- data/data/plates/_decode/ch-cantons.yml +110 -0
- data/data/plates/_decode/cn-issuing-offices.yml +463 -0
- data/data/plates/_decode/cn-provinces.yml +614 -0
- data/data/plates/_decode/cz-kraj.yml +159 -0
- data/data/plates/_decode/dk-serial-blocks.yml +327 -0
- data/data/plates/_decode/fr-departements.yml +191 -0
- data/data/plates/_decode/gb-age-identifiers.yml +170 -0
- data/data/plates/_decode/gb-memory-tags.yml +202 -0
- data/data/plates/_decode/gr-prefectures.yml +1408 -0
- data/data/plates/_decode/hr-cities.yml +315 -0
- data/data/plates/_decode/ie-counties.yml +227 -0
- data/data/plates/_decode/in-state-codes.yml +169 -0
- data/data/plates/_decode/is-districts-1938.yml +116 -0
- data/data/plates/_decode/it-provinces.yml +348 -0
- data/data/plates/_decode/jp-office-marks.yml +960 -0
- data/data/plates/_decode/jp-use-marks.yml +205 -0
- data/data/plates/_decode/kr-authority-marks.yml +146 -0
- data/data/plates/_decode/kr-use-syllables.yml +194 -0
- data/data/plates/_decode/lu-series-order.yml +638 -0
- data/data/plates/_decode/mx-entity-series.yml +380 -0
- data/data/plates/_decode/my-index-marks.yml +271 -0
- data/data/plates/_decode/no-counties-1913.yml +148 -0
- data/data/plates/_decode/no-districts.yml +901 -0
- data/data/plates/_decode/pl-powiats.yml +567 -0
- data/data/plates/_decode/pt-trailer-services.yml +96 -0
- data/data/plates/_decode/ro-counties.yml +213 -0
- data/data/plates/_decode/se-diplomatic.yml +220 -0
- data/data/plates/_decode/si-regions.yml +123 -0
- data/data/plates/_decode/sk-districts.yml +314 -0
- data/data/plates/_decode/th-registration-elements.yml +208 -0
- data/data/plates/_decode/ua-regions.yml +393 -0
- data/data/plates/_decode/za-licence-marks.yml +215 -0
- data/data/plates/_meta/classes.yml +1 -0
- data/data/plates/_meta/separators.yml +102 -0
- data/data/plates/ad.yml +961 -0
- data/data/plates/ar.yml +762 -0
- data/data/plates/at.yml +1424 -0
- data/data/plates/au-act.yml +472 -0
- data/data/plates/au-nsw.yml +282 -0
- data/data/plates/au-nt.yml +431 -0
- data/data/plates/au-qld.yml +272 -0
- data/data/plates/au-sa.yml +248 -0
- data/data/plates/au-tas.yml +302 -0
- data/data/plates/au-vic.yml +215 -0
- data/data/plates/au-wa.yml +309 -0
- data/data/plates/be.yml +1840 -0
- data/data/plates/br.yml +1152 -0
- data/data/plates/ca-ab.yml +430 -0
- data/data/plates/ca-bc.yml +697 -0
- data/data/plates/ca-mb.yml +499 -0
- data/data/plates/ca-nb.yml +537 -0
- data/data/plates/ca-nl.yml +743 -0
- data/data/plates/ca-ns.yml +808 -0
- data/data/plates/ca-nt.yml +610 -0
- data/data/plates/ca-nu.yml +280 -0
- data/data/plates/ca-on.yml +881 -0
- data/data/plates/ca-pe.yml +592 -0
- data/data/plates/ca-qc.yml +1036 -0
- data/data/plates/ca-sk.yml +256 -0
- data/data/plates/ca-yt.yml +656 -0
- data/data/plates/ch.yml +1273 -0
- data/data/plates/cn.yml +1431 -0
- data/data/plates/cy.yml +688 -0
- data/data/plates/cz.yml +1179 -0
- data/data/plates/de.yml +553 -118
- data/data/plates/dk.yml +1647 -0
- data/data/plates/ee.yml +1275 -0
- data/data/plates/es.yml +228 -32
- data/data/plates/fi.yml +1271 -0
- data/data/plates/fr.yml +1265 -0
- data/data/plates/gb.yml +1188 -0
- data/data/plates/gr.yml +721 -0
- data/data/plates/hr.yml +860 -0
- data/data/plates/hu.yml +959 -0
- data/data/plates/ie.yml +775 -0
- data/data/plates/in.yml +1172 -0
- data/data/plates/is.yml +667 -0
- data/data/plates/it.yml +1317 -0
- data/data/plates/jp.yml +3650 -0
- data/data/plates/kr.yml +1375 -0
- data/data/plates/li.yml +1010 -0
- data/data/plates/lt.yml +879 -0
- data/data/plates/lu.yml +842 -0
- data/data/plates/lv.yml +924 -0
- data/data/plates/mc.yml +1024 -0
- data/data/plates/mt.yml +854 -0
- data/data/plates/mx.yml +1372 -0
- data/data/plates/my.yml +685 -0
- data/data/plates/nl.yml +44 -0
- data/data/plates/no.yml +1018 -0
- data/data/plates/nz.yml +1699 -0
- data/data/plates/pl.yml +1296 -0
- data/data/plates/pt.yml +847 -0
- data/data/plates/ro.yml +785 -0
- data/data/plates/se.yml +1091 -0
- data/data/plates/si.yml +1105 -0
- data/data/plates/sk.yml +1439 -0
- data/data/plates/sm.yml +1119 -0
- data/data/plates/th.yml +1150 -0
- data/data/plates/ua.yml +1672 -0
- data/data/plates/us-ak.yml +763 -0
- data/data/plates/us-al.yml +457 -0
- data/data/plates/us-ar.yml +427 -0
- data/data/plates/us-as.yml +454 -0
- data/data/plates/us-az.yml +430 -0
- data/data/plates/us-ca.yml +892 -0
- data/data/plates/us-co.yml +452 -0
- data/data/plates/us-ct.yml +427 -0
- data/data/plates/us-dc.yml +614 -0
- data/data/plates/us-de.yml +551 -0
- data/data/plates/us-fl.yml +319 -96
- data/data/plates/us-ga.yml +644 -0
- data/data/plates/us-gu.yml +658 -0
- data/data/plates/us-hi.yml +585 -0
- data/data/plates/us-ia.yml +438 -0
- data/data/plates/us-id.yml +531 -0
- data/data/plates/us-il.yml +516 -0
- data/data/plates/us-in.yml +324 -0
- data/data/plates/us-ks.yml +351 -0
- data/data/plates/us-ky.yml +770 -0
- data/data/plates/us-la.yml +568 -0
- data/data/plates/us-ma.yml +379 -0
- data/data/plates/us-md.yml +536 -0
- data/data/plates/us-me.yml +445 -0
- data/data/plates/us-mi.yml +408 -0
- data/data/plates/us-mn.yml +411 -0
- data/data/plates/us-mo.yml +356 -0
- data/data/plates/us-mp.yml +402 -0
- data/data/plates/us-ms.yml +432 -0
- data/data/plates/us-mt.yml +619 -0
- data/data/plates/us-nc.yml +602 -0
- data/data/plates/us-nd.yml +419 -0
- data/data/plates/us-ne.yml +483 -0
- data/data/plates/us-nh.yml +394 -0
- data/data/plates/us-nj.yml +547 -0
- data/data/plates/us-nm.yml +574 -0
- data/data/plates/us-nv.yml +655 -0
- data/data/plates/us-ny.yml +592 -0
- data/data/plates/us-oh.yml +404 -0
- data/data/plates/us-ok.yml +513 -0
- data/data/plates/us-or.yml +392 -0
- data/data/plates/us-pa.yml +506 -0
- data/data/plates/us-pr.yml +507 -0
- data/data/plates/us-ri.yml +445 -0
- data/data/plates/us-sc.yml +605 -0
- data/data/plates/us-sd.yml +428 -0
- data/data/plates/us-tn.yml +471 -0
- data/data/plates/us-tx.yml +535 -0
- data/data/plates/us-ut.yml +384 -0
- data/data/plates/us-va.yml +567 -0
- data/data/plates/us-vi.yml +489 -0
- data/data/plates/us-vt.yml +458 -0
- data/data/plates/us-wa.yml +484 -0
- data/data/plates/us-wi.yml +509 -0
- data/data/plates/us-wv.yml +446 -0
- data/data/plates/us-wy.yml +523 -0
- data/data/plates/va.yml +604 -0
- data/data/plates/za.yml +1141 -0
- data/data/vehicles.json +160653 -105090
- data/lib/vehicles/configuration.rb +17 -3
- data/lib/vehicles/dataset.rb +73 -18
- data/lib/vehicles/fuzzy.rb +115 -0
- data/lib/vehicles/http.rb +48 -0
- data/lib/vehicles/make.rb +36 -6
- data/lib/vehicles/mcp_server.rb +5 -5
- data/lib/vehicles/model.rb +21 -2
- data/lib/vehicles/plates/series.rb +172 -18
- data/lib/vehicles/plates/template_fill.rb +188 -0
- data/lib/vehicles/plates/templates.rb +162 -0
- data/lib/vehicles/plates.rb +12 -0
- data/lib/vehicles/providers/hosted_provider.rb +28 -55
- data/lib/vehicles/validators/vehicle_make_validator.rb +3 -1
- data/lib/vehicles/validators/vehicle_model_validator.rb +1 -1
- data/lib/vehicles/version.rb +1 -1
- data/lib/vehicles.rb +32 -16
- data/rakelib/data_refresh.rake +109 -0
- data/rakelib/plates_refresh.rake +29 -0
- data/sig/vehicles.rbs +18 -0
- metadata +164 -2
data/data/plates/my.yml
ADDED
|
@@ -0,0 +1,685 @@
|
|
|
1
|
+
# plates/my.yml — Malaysia (PRD-PLATES gate L3). DRAFT for verification.
|
|
2
|
+
#
|
|
3
|
+
# ===========================================================================
|
|
4
|
+
# THE CENTRAL SOURCING FACT, STATED FIRST BECAUSE IT SHAPES EVERY ENTRY
|
|
5
|
+
# ===========================================================================
|
|
6
|
+
# THE COMPOSITION OF A MALAYSIAN REGISTRATION NUMBER IS NOT IN ANY INSTRUMENT
|
|
7
|
+
# THIS PASS COULD OBTAIN. The Road Transport Act 1987 (Act 333) creates the
|
|
8
|
+
# object and then delegates every detail of it. Section 11(1)(a), verbatim
|
|
9
|
+
# from the Attorney General's Chambers updated text as at 15 October 2023:
|
|
10
|
+
#
|
|
11
|
+
# "Upon the registration of a motor vehicle, the Director shall—
|
|
12
|
+
# (a) assign to the motor vehicle THE PRESCRIBED INDEX MARK indicating the
|
|
13
|
+
# registration area in which the vehicle is registered or the status of
|
|
14
|
+
# the owner of the motor vehicle AND A SEPARATE NUMBER (in this Act such
|
|
15
|
+
# mark and number are referred to collectively as 'the registration
|
|
16
|
+
# number'), and such registration number shall continue to be the
|
|
17
|
+
# registration number of such motor vehicle until it is broken up,
|
|
18
|
+
# destroyed or sent permanently out of Malaysia, and such registration
|
|
19
|
+
# number shall not be assigned to any other motor vehicle"
|
|
20
|
+
#
|
|
21
|
+
# Read that clause closely: it fixes the STRUCTURE — an index mark plus a
|
|
22
|
+
# separate number — and the SEMANTICS of the mark (registration area, or owner
|
|
23
|
+
# status), and it fixes the binding (to the vehicle, for life). It does not
|
|
24
|
+
# say A is Perak. "Prescribed" means prescribed by rules, and the rules are the
|
|
25
|
+
# Motor Vehicles (Registration and Licensing) Rules 1959, which the AGC's own
|
|
26
|
+
# federal-legislation portal DOES NOT CARRY: its subsidiary-legislation index
|
|
27
|
+
# for Act 333 returns 727 records and the oldest is from 2000, with the
|
|
28
|
+
# Registration and Licensing Rules present only as AMENDMENTS (P.U. (A) 79 and
|
|
29
|
+
# 94 of 2012, 100/2018, 98 and 177/2019, 36/2023, 177/2024, 464/2025). The
|
|
30
|
+
# PRINCIPAL 1959 rules are not digitised anywhere this pass could reach.
|
|
31
|
+
#
|
|
32
|
+
# CONSEQUENCE, AND IT IS THE GERMAN RESULT AGAIN: the index-mark table — the
|
|
33
|
+
# single most valuable decode dimension in this jurisdiction — is sourced to
|
|
34
|
+
# the AUTHORITY'S OWN PUBLISHED SYSTEM rather than to the instrument that
|
|
35
|
+
# legally prescribes it. plates/_decode/my-index-marks.yml carries it, keyed to
|
|
36
|
+
# the JPJ portal's own location API, with `evidence: agency-api` on every row
|
|
37
|
+
# and the instrument gap stated at the top. Exactly as § 9 FZV delegates the
|
|
38
|
+
# German district codes to the Bundesanzeiger and VERA 1994 leaves the British
|
|
39
|
+
# memory tag to INF104, Act 333 leaves the Malaysian index mark to a 1959
|
|
40
|
+
# statutory rule nobody has put online.
|
|
41
|
+
#
|
|
42
|
+
# Display is delegated the same way. Section 14(1), verbatim:
|
|
43
|
+
#
|
|
44
|
+
# "The registration number assigned to a motor vehicle upon registration or a
|
|
45
|
+
# new registration number assigned under section 11 shall be displayed and
|
|
46
|
+
# illuminated on the number plate IN THE MANNER PRESCRIBED BY RULES MADE
|
|
47
|
+
# UNDER THIS ACT."
|
|
48
|
+
#
|
|
49
|
+
# and the rule-making power, section 66(1)(s), verbatim:
|
|
50
|
+
#
|
|
51
|
+
# "to prescribe the size, shape and character of the registration number and
|
|
52
|
+
# signs to be displayed on any motor vehicle and the manner in which those
|
|
53
|
+
# registration numbers or signs are to be fixed, displayed, illuminated and
|
|
54
|
+
# rendered easily distinguishable, whether by night or day, and to provide
|
|
55
|
+
# for a distinctive registration number or other sign to be carried by
|
|
56
|
+
# public service vehicles or goods vehicles, or by public service vehicles
|
|
57
|
+
# or goods vehicles licensed for a particular purpose"
|
|
58
|
+
#
|
|
59
|
+
# So Malaysia's law fixes: that there is an index mark; that it means area or
|
|
60
|
+
# owner status; that the number stays with the vehicle for life; that public
|
|
61
|
+
# service and goods vehicles MAY be given a distinctive number or sign; and
|
|
62
|
+
# that the Minister prescribes size, shape and character. Everything a plate
|
|
63
|
+
# dataset actually wants is one layer below that, in an unreachable instrument.
|
|
64
|
+
# Every series below therefore separates, in its own sources block, what comes
|
|
65
|
+
# from THE ACT, what comes from THE AUTHORITY'S PAGES, and what comes from
|
|
66
|
+
# secondary sources — and tags the last of those honestly.
|
|
67
|
+
#
|
|
68
|
+
# ===========================================================================
|
|
69
|
+
# THE ONE PIECE OF LIVE PRIMARY EVIDENCE, AND IT IS UNUSUALLY GOOD
|
|
70
|
+
# ===========================================================================
|
|
71
|
+
# JPJ operates a public "Semakan Nombor Pendaftaran Terkini" (latest
|
|
72
|
+
# registration number enquiry) service backed by a JSON API at
|
|
73
|
+
# portal-api.jpj.gov.my. Two endpoints were called directly:
|
|
74
|
+
# * /api/locations -> the CLOSED list of 32 registration
|
|
75
|
+
# offices/areas with their codes
|
|
76
|
+
# * /api/semak-no-pendaftaran-terkini -> for each code, THE REGISTRATION
|
|
77
|
+
# NUMBER CURRENTLY BEING ISSUED there
|
|
78
|
+
# The second call is a dated observation of the authority's own live counter,
|
|
79
|
+
# captured 3 August 2026 00:47–00:49 (+08), and it is the evidence that pins
|
|
80
|
+
# the CURRENT format of every Malaysian state in one pass. Its readings are
|
|
81
|
+
# recorded per row in plates/_decode/my-index-marks.yml and drive the two
|
|
82
|
+
# standard series below. This is as close to a registration-corpus test
|
|
83
|
+
# (PRD-PLATES §5.2) as a jurisdiction without open registry data can get.
|
|
84
|
+
#
|
|
85
|
+
# WHAT THE SNAPSHOT PROVES, mechanically, from 28 successful readings:
|
|
86
|
+
# * TWO live arrangements coexist nationwide, not one.
|
|
87
|
+
# - PREFIX FORM, no suffix: KGH 3943 (Kedah), MEG 6121 (Melaka),
|
|
88
|
+
# NEL 2986 (Negeri Sembilan), CFH 3542 (Pahang), PSE 4213 (Penang),
|
|
89
|
+
# APK 4191 (Perak), BSS 3435 (Selangor), TDH 3264 (Terengganu),
|
|
90
|
+
# DFQ 9814 (Kelantan), SJT 4199 (Kota Kinabalu), SMW 5063 (Sandakan),
|
|
91
|
+
# SWR 9584 (Tawau), SPA 3076 (Lahad Datu), QAB 3426P is not this form,
|
|
92
|
+
# QBH 8695 (Betong), QRY 2592 (Sarikei), QLG 4546 (Lawas),
|
|
93
|
+
# QCW 4437 (Kota Samarahan), QPD 9177 (Kapit), VRJ 7380 (Kuala Lumpur),
|
|
94
|
+
# LH 6757 (Labuan).
|
|
95
|
+
# - SUFFIX FORM, a single trailing letter: JB 6419 J (Johor),
|
|
96
|
+
# KV 859 F (Langkawi), SK 4097 H (Kudat), SB 1644 L (Beaufort),
|
|
97
|
+
# SU 7665 Q (Keningau), QS 5608 Y (Mukah), QM 5771 U (Miri),
|
|
98
|
+
# QAB 3426 P (Kuching).
|
|
99
|
+
# Both are current. Neither is historic. A dataset that models only the
|
|
100
|
+
# three-letter prefix form is wrong for eight of the twenty-eight areas
|
|
101
|
+
# JPJ itself lists.
|
|
102
|
+
# * KUALA LUMPUR IS KEYED "W" AND ISSUES "V". Querying the area code W
|
|
103
|
+
# ("Wilayah Persekutuan Kuala Lumpur") returns VRJ7380. That is the
|
|
104
|
+
# authority's own confirmation, in one datum, that the V series is the
|
|
105
|
+
# continuation of the W registration area rather than a new area — the
|
|
106
|
+
# fact every secondary account states and none of them sources.
|
|
107
|
+
# * THE SUFFIX LETTER IS NOT A CHECK DIGIT and carries no visible arithmetic
|
|
108
|
+
# relation to the number (J on 6419, F on 859, H on 4097, L on 1644,
|
|
109
|
+
# Q on 7665, Y on 5608, U on 5771, P on 3426). It is a series counter.
|
|
110
|
+
#
|
|
111
|
+
# ===========================================================================
|
|
112
|
+
# THE EXCLUDED LETTERS — AND A FOLKLORE CORRECTION THIS FILE MAKES EXPLICITLY
|
|
113
|
+
# ===========================================================================
|
|
114
|
+
# The rule Malaysia actually runs, per both the English and Malay Wikipedia
|
|
115
|
+
# articles (the mandatory finding aid, PRD-PLATES §4) and CONSISTENT WITH every
|
|
116
|
+
# one of the 28 live JPJ readings above: the letters I and O are never issued
|
|
117
|
+
# (confusable with 1 and 0) and Z is reserved for military vehicles. The Malay
|
|
118
|
+
# article states it directly — "Huruf I dan O ditiadakan daripada urutan abjad
|
|
119
|
+
# kerana persamaannya dengan nombor 1 dan 0. Huruf Z ditinggalkan dan
|
|
120
|
+
# dikhaskan untuk digunakan pada kenderaan tentera Malaysia."
|
|
121
|
+
#
|
|
122
|
+
# THERE IS NO "NO VOWELS" RULE IN MALAYSIA, and the claim that there is — which
|
|
123
|
+
# circulates in plate-format lists and was carried into this programme's own
|
|
124
|
+
# briefing — is FALSE ON THE AUTHORITY'S OWN DATA. A is a state mark (Perak);
|
|
125
|
+
# the live snapshot contains SPA, QAB and APK; E and U appear freely in
|
|
126
|
+
# suffixes (SU 7665 Q, QM 5771 U). Only I and O are dropped, and only Z is
|
|
127
|
+
# reserved. Recorded here as a folklore correction, with the counter-evidence,
|
|
128
|
+
# rather than silently omitted. See dossier-my.md §6.
|
|
129
|
+
#
|
|
130
|
+
# NOTE THE ONE PLACE THE EXCLUSION IS NOT VISIBLE: it is an ISSUING rule, not a
|
|
131
|
+
# spelling rule, so `format.regex` cannot carry it (the lint generates "I" and
|
|
132
|
+
# "O" from `pattern`). It lives in `format.regex_strict` on every series that
|
|
133
|
+
# has one, which is exactly what PRD-PLATES §2.7 built the twin for.
|
|
134
|
+
#
|
|
135
|
+
# ===========================================================================
|
|
136
|
+
# WHAT IS DELIBERATELY NOT MODELLED
|
|
137
|
+
# ===========================================================================
|
|
138
|
+
# THE SPECIAL-SERIES OCEAN. JPJ runs a continuous programme of bid-for special
|
|
139
|
+
# registration series through JPJeBid, with statutory footing in Act 333
|
|
140
|
+
# s. 66(1)(jj) ("to prescribe the procedures relating to tender of registration
|
|
141
|
+
# numbers"). Well over a hundred series have been released — anniversary series
|
|
142
|
+
# (FA, FB, FC, FD, FE, FF, FFF, FG, FH), university series, NGO series, event
|
|
143
|
+
# series, the national "MALAYSIA 1-9999" series. Each is an ORDINARY
|
|
144
|
+
# registration whose mark was auctioned; none has its own format, design or
|
|
145
|
+
# period. PRD-PLATES §2.5 excludes exactly this, so the programme is recorded
|
|
146
|
+
# once, as a class note on my-standard-prefix (see `special_series` in
|
|
147
|
+
# `common`), and no series is authored for any individual release. The one
|
|
148
|
+
# exception is `my-jpjeplate-ev-2024`, which is a genuinely different PLATE
|
|
149
|
+
# rather than a different mark.
|
|
150
|
+
#
|
|
151
|
+
# PLATE DIMENSIONS ARE ABSENT FROM THIS FILE AND THEIR ABSENCE IS A FINDING.
|
|
152
|
+
# Act 333 s. 66(1)(s) empowers the Minister to prescribe "the size, shape and
|
|
153
|
+
# character" of the registration number, but the rules that do so were not
|
|
154
|
+
# obtained; JPJ's own "Plate Number Specification" knowledge-base article
|
|
155
|
+
# carries the measurements ONLY as an image ("Examples of Vehicle Plate
|
|
156
|
+
# Measures") with no text equivalent. No `design.plate` block is written
|
|
157
|
+
# anywhere below rather than invent millimetres, and the same posture applies
|
|
158
|
+
# to the typeface: no instrument located names one. This is plates/gb.yml's
|
|
159
|
+
# posture for the same reason (there, BS AU 145e is paywalled; here, the rules
|
|
160
|
+
# are simply not online).
|
|
161
|
+
jurisdiction: my
|
|
162
|
+
authority:
|
|
163
|
+
name: Jabatan Pengangkutan Jalan Malaysia (JPJ) — Road Transport Department Malaysia, for the Minister of Transport
|
|
164
|
+
url: "https://www.jpj.gov.my/"
|
|
165
|
+
binding: vehicle
|
|
166
|
+
binding_note: >-
|
|
167
|
+
Act 333 s. 11(1)(a), verbatim: the registration number "shall continue to be
|
|
168
|
+
the registration number of such motor vehicle UNTIL IT IS BROKEN UP,
|
|
169
|
+
DESTROYED OR SENT PERMANENTLY OUT OF MALAYSIA, and such registration number
|
|
170
|
+
shall not be assigned to any other motor vehicle". The same subsection then
|
|
171
|
+
carries Malaysia's cherished-transfer proviso: a registered owner may,
|
|
172
|
+
"subject to any terms and conditions which may be prescribed, and on payment
|
|
173
|
+
of the prescribed fee, have the number assigned to such motor vehicle
|
|
174
|
+
assigned to another motor vehicle of which he applies to be registered as
|
|
175
|
+
owner and which has not previously been registered", whereupon the Director
|
|
176
|
+
assigns a new number to the first vehicle. Structurally identical to the UK
|
|
177
|
+
retention scheme, and in the ACT rather than in guidance.
|
|
178
|
+
|
|
179
|
+
instrument:
|
|
180
|
+
citation: "Road Transport Act 1987 (Act 333), Laws of Malaysia"
|
|
181
|
+
royal_assent: "1987-08-30"
|
|
182
|
+
gazetted: "1987-09-24"
|
|
183
|
+
text_status: >-
|
|
184
|
+
The text used is the Attorney General's Chambers ONLINE VERSION OF UPDATED
|
|
185
|
+
TEXT OF REPRINT, "As at 15 October 2023", latest amendment Act A1684 in
|
|
186
|
+
operation 15 October 2023. AGC's own front matter warns: "This text is ONLY
|
|
187
|
+
AN UPDATED TEXT of the Road Transport Act 1987 by the Attorney General's
|
|
188
|
+
Chambers. Unless and until reprinted pursuant to the powers of the
|
|
189
|
+
Commissioner of Law Revision under subsection 14(1) of the Revision of Laws
|
|
190
|
+
Act 1968 [Act 1], this text is NOT AN AUTHENTIC TEXT." Recorded because
|
|
191
|
+
PRD-PLATES §5.3 says the authority is the authority: this is the authority's
|
|
192
|
+
own updated text, published by the authority, flagged by the authority as
|
|
193
|
+
non-authentic. Every quotation above and below is from it.
|
|
194
|
+
sections_used:
|
|
195
|
+
- "s. 11(1)(a) — assignment of the prescribed index mark and a separate number; lifetime binding to the vehicle; the cherished-transfer proviso"
|
|
196
|
+
- "s. 11(1A) — re-assignment of a number from a lost/stolen/destroyed/exported vehicle, on the Director General's prescribed terms"
|
|
197
|
+
- "s. 14(1) — display and illumination of the registration number on the number plate 'in the manner prescribed by rules made under this Act'"
|
|
198
|
+
- "s. 14(3) — a drawn trailer must display BOTH its own registration number and that of the drawing vehicle"
|
|
199
|
+
- "s. 14(4) — penalty for non-display: fine of not less than RM300 and not more than RM3,000"
|
|
200
|
+
- "s. 66(1)(s) — the rule-making power over size, shape and character of the registration number, and over distinctive numbers or signs for public service and goods vehicles"
|
|
201
|
+
- "s. 66(1)(jj) — 'to prescribe the procedures relating to tender of registration numbers', the statutory footing of JPJeBid"
|
|
202
|
+
subsidiary_gap: >-
|
|
203
|
+
THE MOTOR VEHICLES (REGISTRATION AND LICENSING) RULES 1959 — the instrument
|
|
204
|
+
that actually prescribes the index marks and the plate — WAS NOT OBTAINED.
|
|
205
|
+
AGC's json-subsid endpoint for Act 333 was called directly and enumerated:
|
|
206
|
+
it holds 727 subsidiary instruments, none earlier than 2000, and the
|
|
207
|
+
Registration and Licensing Rules appear only through their amendments
|
|
208
|
+
(P.U. (A) 79/2012, 94/2012, 100/2018, 98/2019, 177/2019, 36/2023, 177/2024,
|
|
209
|
+
464/2025). No instrument in the index prescribes plates, index marks,
|
|
210
|
+
registration numbers or tender procedure by title.
|
|
211
|
+
source: "https://lom.agc.gov.my/ilims/upload/portal/akta/outputaktap/1871744_BI/Act%20333_Final_15%20Oct%202023%20(25.3.24).pdf # Road Transport Act 1987 (Act 333), AGC updated text as at 15 Oct 2023, 204 pp — ss. 11, 14, 66 quoted above. Accessed 2026-08-02"
|
|
212
|
+
source_subsidiary_index: "https://lom.agc.gov.my/json-subsid-2024.php?act=333 # AGC subsidiary-legislation index for Act 333, 727 records, enumerated 2026-08-02: earliest 2000, no principal 1959 Rules, no plate-specification instrument"
|
|
213
|
+
|
|
214
|
+
charset_defaults:
|
|
215
|
+
letters: [A, B, C, D, E, F, G, H, J, K, L, M, N, P, Q, R, S, T, U, V, W, X, Y]
|
|
216
|
+
excluded_letters: [I, O, Z]
|
|
217
|
+
excluded_letters_note: >-
|
|
218
|
+
I and O are never issued (confusable with the numerals 1 and 0); Z is
|
|
219
|
+
reserved for the Malaysian Armed Forces and is issued only as
|
|
220
|
+
my-military-z. NO VOWEL IS EXCLUDED — see the folklore correction in the
|
|
221
|
+
file header. The rule is not in any instrument located; it is stated by
|
|
222
|
+
the Malay- and English-language Wikipedia articles and is CONSISTENT WITH
|
|
223
|
+
all 28 live JPJ readings of 3 August 2026, none of which contains I, O or
|
|
224
|
+
Z. Tagged `secondary-wikipedia` wherever it is load-bearing, per
|
|
225
|
+
PRD-PLATES §4.
|
|
226
|
+
digits_note: >-
|
|
227
|
+
"No leading zeroes permitted" is stated by the English Wikipedia article
|
|
228
|
+
and is corroborated by every one of the 28 live JPJ readings (859, 1644,
|
|
229
|
+
2592, 3076, 3426, 3435, 3542, 3943, 4097, 4199, 4213, 4437, 4546, 5063,
|
|
230
|
+
5608, 5771, 6121, 6419, 6757, 7380, 7665, 8695, 9177, 9584, 9814, 4191,
|
|
231
|
+
2986, 3264 — not one begins with 0). Carried in `regex_strict` as
|
|
232
|
+
`[1-9]\d{0,3}`, never in `regex`.
|
|
233
|
+
source: "https://ms.wikipedia.org/wiki/Plat_pendaftaran_kenderaan_Malaysia # 'Huruf I dan O ditiadakan daripada urutan abjad kerana persamaannya dengan nombor 1 dan 0. Huruf Z ditinggalkan dan dikhaskan untuk digunakan pada kenderaan tentera Malaysia.' Accessed 2026-08-02. period_evidence: secondary-wikipedia wherever used"
|
|
234
|
+
|
|
235
|
+
common:
|
|
236
|
+
colours:
|
|
237
|
+
jpj_statement: >-
|
|
238
|
+
JPJ's own "Vehicle Number Plate Specifications" page, verbatim as
|
|
239
|
+
published in English in 2013: "3 types of number plates that are allowed
|
|
240
|
+
for use — White alphabets and numbers, embossed or glued on a black
|
|
241
|
+
plate. White alphabets and numbers, embossed or glued on a red plate for
|
|
242
|
+
vehicles belonging to embassies, the UN and the International Natural
|
|
243
|
+
Rubber Association. Black alphabets and numbers, embossed or glued on a
|
|
244
|
+
white plate for taxicabs and hired cars."
|
|
245
|
+
current_wording: >-
|
|
246
|
+
The same article on the current JPJ portal (knowledge base, "Plate Number
|
|
247
|
+
Specification", captured 2023) says the same thing in a rougher machine
|
|
248
|
+
translation: "3 Form of Vehicle Registration Number: White letters and
|
|
249
|
+
numbers are affixed or bounced over a black frame. White letters and
|
|
250
|
+
numbers are affixed or embossed over red frames for embassy vehicles,
|
|
251
|
+
United Nations and the International Natural Rubber Association. Black
|
|
252
|
+
letters and numbers are bounced over white frame for taxi or rental car."
|
|
253
|
+
Both wordings are recorded because the 2013 English is the better text and
|
|
254
|
+
the 2023 page is the live one.
|
|
255
|
+
reading: >-
|
|
256
|
+
THREE plate forms, exhaustively, on the authority's own page: white on
|
|
257
|
+
black (everything ordinary), white on red (embassies, the UN, and — a
|
|
258
|
+
genuine curiosity worth keeping — the INTERNATIONAL NATURAL RUBBER
|
|
259
|
+
ORGANIZATION, which was headquartered in Kuala Lumpur), black on white
|
|
260
|
+
(taxis and hire cars). Note what is NOT there: no reflectivity
|
|
261
|
+
requirement, no colour coordinates, no dimensions in text, no front/rear
|
|
262
|
+
distinction. Every hex below is `hex_basis: observed` inside a named
|
|
263
|
+
colour, the same posture plates/gb.yml and plates/gr.yml take.
|
|
264
|
+
front_rear: >-
|
|
265
|
+
Malaysia is a WHITE-ON-BLACK jurisdiction front and rear — one of very
|
|
266
|
+
few left worldwide, and the single most recognisable thing about a
|
|
267
|
+
Malaysian plate. `rear_differs: false` throughout.
|
|
268
|
+
sources:
|
|
269
|
+
- "https://web.archive.org/web/20130516074518/http://www.jpj.gov.my/web/eng/specifications-of-vehicle-number-plates # JPJ, 'Vehicle Number Plate Specifications', the three permitted plate forms, English. Accessed 2026-08-02"
|
|
270
|
+
- "https://web.archive.org/web/20230527152350/https://www.jpj.gov.my/en/web/main-site/kenderaan1-en/-/knowledge_base/vehicle/plate-number-registration # JPJ knowledge base, 'Plate Number Specification' — same three forms; the dimensions appear only as an image ('Examples of Vehicle Plate Measures') with no text equivalent. Accessed 2026-08-02"
|
|
271
|
+
materials:
|
|
272
|
+
note: >-
|
|
273
|
+
Not prescribed by anything located. Malaysian plates are overwhelmingly
|
|
274
|
+
MOULDED PLASTIC with applied characters rather than pressed metal, which
|
|
275
|
+
is why kerning-tightening to defeat cameras is a live Malaysian
|
|
276
|
+
enforcement problem and why JPJ has repeatedly floated standardised
|
|
277
|
+
pressed plates. Recorded as context, not as a dataset claim.
|
|
278
|
+
special_series:
|
|
279
|
+
note: >-
|
|
280
|
+
JPJeBid: JPJ tenders "special" registration marks continuously, under
|
|
281
|
+
Act 333 s. 66(1)(jj). Each release (FA/FB/FC/FD/FE/FF/FFF/FG/FH
|
|
282
|
+
anniversary series, university and NGO series, the national
|
|
283
|
+
"MALAYSIA 1-9999" series, and well over a hundred others) is an ORDINARY
|
|
284
|
+
registration under my-standard-prefix or my-standard-suffix whose mark
|
|
285
|
+
was auctioned rather than allocated in sequence. No separate series is
|
|
286
|
+
authored for any of them (PRD-PLATES §2.5); a consumer wanting the
|
|
287
|
+
programme index should treat it as the Malaysian analogue of a US
|
|
288
|
+
specialty-plate index, which PRD-PLATES puts at L2/L4.
|
|
289
|
+
statutory_basis: "Act 333 s. 66(1)(jj), verbatim: 'to prescribe the procedures relating to tender of registration numbers'"
|
|
290
|
+
source: "https://lom.agc.gov.my/ilims/upload/portal/akta/outputaktap/1871744_BI/Act%20333_Final_15%20Oct%202023%20(25.3.24).pdf # s. 66(1)(jj). Accessed 2026-08-02"
|
|
291
|
+
|
|
292
|
+
series:
|
|
293
|
+
|
|
294
|
+
- id: my-standard-prefix
|
|
295
|
+
class: standard
|
|
296
|
+
categories: [car, van, truck, bus, motorcycle]
|
|
297
|
+
period: { start: 1987 }
|
|
298
|
+
period_evidence: instrument-in-force
|
|
299
|
+
matching: strict
|
|
300
|
+
format:
|
|
301
|
+
pattern: "LLL 9999"
|
|
302
|
+
regex: '\A[A-Z]{1,3}[- ]?\d{1,4}\z'
|
|
303
|
+
regex_strict: '\A[ABCDFJKLMNPQRSTVW][A-HJ-NP-Y]{0,2}[- ]?[1-9]\d{0,3}\z'
|
|
304
|
+
charset:
|
|
305
|
+
first_letter_note: >-
|
|
306
|
+
The first letter is the STATE OR TERRITORY INDEX MARK and comes from
|
|
307
|
+
the closed set JPJ's own location API publishes: A B C D F J K L M N P
|
|
308
|
+
R T W (peninsular states and federal territories), V (Kuala Lumpur's
|
|
309
|
+
second series), Q (Sarawak) and S (Sabah). E G H U X Y do not open an
|
|
310
|
+
ordinary registration — E was Sabah's pre-1963 mark, H is the hire
|
|
311
|
+
prefix (my-taxi), Z is military (my-military-z) — and I and O are
|
|
312
|
+
never issued at all.
|
|
313
|
+
See plates/_decode/my-index-marks.yml.
|
|
314
|
+
excluded: [I, O, Z]
|
|
315
|
+
no_leading_zero: true
|
|
316
|
+
progression: >-
|
|
317
|
+
The letters after the index mark advance alphabetically, skipping I, O
|
|
318
|
+
and Z, and the number runs 1-9999 within each letter combination:
|
|
319
|
+
A 1 … A 9999, AA 1 … AA 9999, AB 1 …, and so on to AY 9999, then AAA 1.
|
|
320
|
+
This is the mechanism every secondary account gives and the live JPJ
|
|
321
|
+
readings are consistent with it (Perak is at APK, Selangor at BSS,
|
|
322
|
+
Kelantan at DFQ — three letters deep in each case). The mechanism itself
|
|
323
|
+
is not in any instrument located: recorded as mechanism, not as law.
|
|
324
|
+
separator_note: >-
|
|
325
|
+
NO SEPARATOR GLYPH is prescribed by anything located, and Malaysian
|
|
326
|
+
plates print a GAP between the letter group and the number group. The
|
|
327
|
+
space in `pattern` is that gap; every regex accepts it as optional and
|
|
328
|
+
also accepts a hyphen, per PRD-PLATES §2.8 (a separator-only class).
|
|
329
|
+
design:
|
|
330
|
+
background: { color: "#000000", finish: non-reflective, hex_basis: observed }
|
|
331
|
+
foreground: "#FFFFFF"
|
|
332
|
+
band: { side: none }
|
|
333
|
+
emblem: { present: false }
|
|
334
|
+
rear_differs: false
|
|
335
|
+
plate_note: >-
|
|
336
|
+
NO `design.plate` BLOCK: no located instrument or authority text gives
|
|
337
|
+
millimetres. See the file header — JPJ publishes the measurements only
|
|
338
|
+
as an image. Recorded gap, deliberately not estimated.
|
|
339
|
+
font_note: >-
|
|
340
|
+
NO TYPEFACE IS PRESCRIBED by anything located. JPJ's specification page
|
|
341
|
+
carries a diagram which secondary accounts read as naming a compact
|
|
342
|
+
Arial Bold with Calisto MT Italic and Franklin Gothic Bold as
|
|
343
|
+
alternates; the diagram is an image and was not read in this pass.
|
|
344
|
+
Charles Wright and FE-Schrift are both common in the wild and both are
|
|
345
|
+
aftermarket choices, not standards. PRD-PLATES §6's schematic-render
|
|
346
|
+
fallback applies.
|
|
347
|
+
region_encoding: "plates/_decode/my-index-marks.yml"
|
|
348
|
+
sources:
|
|
349
|
+
- "https://lom.agc.gov.my/ilims/upload/portal/akta/outputaktap/1871744_BI/Act%20333_Final_15%20Oct%202023%20(25.3.24).pdf # Road Transport Act 1987 s. 11(1)(a) — 'the prescribed index mark indicating the registration area ... and a separate number', which is this format's structure and the whole of what statute gives; s. 14(1) display. Accessed 2026-08-02"
|
|
350
|
+
- "https://web.archive.org/web/20130516074518/http://www.jpj.gov.my/web/eng/specifications-of-vehicle-number-plates # JPJ: 'White alphabets and numbers, embossed or glued on a black plate' — the ordinary plate's colours. Accessed 2026-08-02"
|
|
351
|
+
- "https://portal-api.jpj.gov.my/api/semak-no-pendaftaran-terkini # JPJ live 'latest registration number' API, queried per area code 2026-08-03 00:47-00:49 (+08): KGH 3943 Kedah, MEG 6121 Melaka, NEL 2986 Negeri Sembilan, CFH 3542 Pahang, PSE 4213 Penang, APK 4191 Perak, BSS 3435 Selangor, TDH 3264 Terengganu, DFQ 9814 Kelantan, VRJ 7380 Kuala Lumpur, LH 6757 Labuan, SJT 4199 Kota Kinabalu, SMW 5063 Sandakan, SWR 9584 Tawau, SPA 3076 Lahad Datu, QBH 8695 Betong, QRY 2592 Sarikei, QLG 4546 Lawas, QCW 4437 Kota Samarahan, QPD 9177 Kapit — the prefix form, in issue now"
|
|
352
|
+
- "https://ms.wikipedia.org/wiki/Plat_pendaftaran_kenderaan_Malaysia # the I/O/Z exclusion carried in regex_strict. period_evidence: secondary-wikipedia. Accessed 2026-08-02"
|
|
353
|
+
notes: >-
|
|
354
|
+
THE ORDINARY MALAYSIAN PLATE, prefix form: one to three letters, a gap,
|
|
355
|
+
one to four digits, white on black, front and rear. period.start 1987 is
|
|
356
|
+
the Road Transport Act 1987, which is the instrument currently in force
|
|
357
|
+
and NOT the date the format began — the index-mark system runs back
|
|
358
|
+
through the Road Traffic Ordinance 1958 to the 1948 rationalisation of
|
|
359
|
+
the state marks (PK->A, JB->J and the rest), and this file makes no claim
|
|
360
|
+
about those dates because no instrument for them was obtained.
|
|
361
|
+
`period_evidence: instrument-in-force` is therefore the honest tag and the
|
|
362
|
+
pre-1987 boundary is a recorded gap. Runs in PARALLEL with
|
|
363
|
+
my-standard-suffix, which is a different arrangement of the same
|
|
364
|
+
statutory mark-plus-number and is equally current — eight of JPJ's
|
|
365
|
+
twenty-eight live areas were issuing the suffix form on 3 August 2026.
|
|
366
|
+
|
|
367
|
+
- id: my-standard-suffix
|
|
368
|
+
class: standard
|
|
369
|
+
categories: [car, van, truck, bus, motorcycle]
|
|
370
|
+
period: { start: 1987 }
|
|
371
|
+
period_evidence: instrument-in-force
|
|
372
|
+
matching: strict
|
|
373
|
+
format:
|
|
374
|
+
pattern: "LLL 9999 L"
|
|
375
|
+
regex: '\A[A-Z]{1,3}[- ]?\d{1,4}[- ]?[A-Z]\z'
|
|
376
|
+
regex_strict: '\A[ABCDFJKLMNPQRSTVW][A-HJ-NP-Y]{0,2}[- ]?[1-9]\d{0,3}[- ]?[A-HJ-NP-Y]\z'
|
|
377
|
+
charset:
|
|
378
|
+
excluded: [I, O, Z]
|
|
379
|
+
no_leading_zero: true
|
|
380
|
+
suffix_note: >-
|
|
381
|
+
The trailing letter is a SERIES COUNTER, not a check digit and not a
|
|
382
|
+
locality code: the live JPJ readings pair J with 6419, F with 859, H
|
|
383
|
+
with 4097, L with 1644, Q with 7665, Y with 5608, U with 5771 and P
|
|
384
|
+
with 3426, and no arithmetic relation survives that. Secondary
|
|
385
|
+
accounts add that Q and S are avoided as suffixes in Sabah and
|
|
386
|
+
Sarawak to prevent collision with the division prefixes; that
|
|
387
|
+
refinement is NOT carried in regex_strict because the live sample
|
|
388
|
+
contains a Q suffix (SU 7665 Q, Keningau) which contradicts it.
|
|
389
|
+
Recorded as a disagreement, not averaged (PRD-PLATES §5.3).
|
|
390
|
+
separator_note: "two printed gaps, both optional in the regexes and both spelled as separator-only classes"
|
|
391
|
+
design:
|
|
392
|
+
background: { color: "#000000", finish: non-reflective, hex_basis: observed }
|
|
393
|
+
foreground: "#FFFFFF"
|
|
394
|
+
band: { side: none }
|
|
395
|
+
emblem: { present: false }
|
|
396
|
+
rear_differs: false
|
|
397
|
+
region_encoding: "plates/_decode/my-index-marks.yml"
|
|
398
|
+
sources:
|
|
399
|
+
- "https://portal-api.jpj.gov.my/api/semak-no-pendaftaran-terkini # JPJ live API, queried per area code 2026-08-03 00:47-00:49 (+08): JB 6419 J Johor, KV 859 F Langkawi, QAB 3426 P Kuching, QS 5608 Y Mukah, QM 5771 U Miri, SK 4097 H Kudat, SB 1644 L Beaufort, SU 7665 Q Keningau — eight of twenty-eight areas issuing the SUFFIX form on that date"
|
|
400
|
+
- "https://lom.agc.gov.my/ilims/upload/portal/akta/outputaktap/1871744_BI/Act%20333_Final_15%20Oct%202023%20(25.3.24).pdf # Road Transport Act 1987 s. 11(1)(a), s. 14(1) — same statutory frame as my-standard-prefix. Accessed 2026-08-02"
|
|
401
|
+
- "https://web.archive.org/web/20130516074518/http://www.jpj.gov.my/web/eng/specifications-of-vehicle-number-plates # colours. Accessed 2026-08-02"
|
|
402
|
+
notes: >-
|
|
403
|
+
THE ORDINARY MALAYSIAN PLATE, suffix form: index mark, number, then a
|
|
404
|
+
single trailing letter — SK 4097 H, QM 5771 U, JB 6419 J. Historically the
|
|
405
|
+
Sabah and Sarawak arrangement, it is now also Johor's (the J…J series),
|
|
406
|
+
Langkawi's (KV) and was Kuala Lumpur's during the W run-out before the V
|
|
407
|
+
series began. Separate series from my-standard-prefix because the FORMAT
|
|
408
|
+
differs (PRD-PLATES §2.3); same statutory frame, same colours, same
|
|
409
|
+
period, and both are live — which is why both carry distinct notes and
|
|
410
|
+
the lint's overlap rule is satisfied honestly rather than by accident.
|
|
411
|
+
period.start 1987 is the Act in force, not the arrangement's origin; the
|
|
412
|
+
suffix form is materially older in East Malaysia and its start is a
|
|
413
|
+
recorded gap.
|
|
414
|
+
|
|
415
|
+
- id: my-taxi
|
|
416
|
+
class: taxi
|
|
417
|
+
categories: [car]
|
|
418
|
+
period: { start: 1987 }
|
|
419
|
+
period_evidence: agency-page-in-force
|
|
420
|
+
matching: strict
|
|
421
|
+
format:
|
|
422
|
+
pattern: "LLL 9999"
|
|
423
|
+
regex: '\A[A-Z]{1,3}[- ]?\d{1,4}\z'
|
|
424
|
+
regex_strict: '\AH[A-HJ-NP-Y]{1,2}[- ]?[1-9]\d{0,3}\z'
|
|
425
|
+
charset:
|
|
426
|
+
first_letter: [H]
|
|
427
|
+
note: >-
|
|
428
|
+
H for HIRE, followed by the state letter — HW for Kuala Lumpur, HP for
|
|
429
|
+
Penang, and so on. THE H PREFIX IS NOT SOURCED TO ANY INSTRUMENT OR
|
|
430
|
+
AUTHORITY PAGE: it is stated by the English Wikipedia article and
|
|
431
|
+
corroborated by photographs. It is carried in `regex_strict` and
|
|
432
|
+
flagged here; the COLOURS, which are the sourced part, are in
|
|
433
|
+
`design`. period_evidence records the sourcing of the SERIES (JPJ's
|
|
434
|
+
own page), not of the prefix.
|
|
435
|
+
excluded: [I, O, Z]
|
|
436
|
+
design:
|
|
437
|
+
background: { color: "#FFFFFF", finish: non-reflective, hex_basis: observed }
|
|
438
|
+
foreground: "#000000"
|
|
439
|
+
band: { side: none }
|
|
440
|
+
emblem: { present: false }
|
|
441
|
+
rear_differs: false
|
|
442
|
+
region_encoding: "plates/_decode/my-index-marks.yml"
|
|
443
|
+
sources:
|
|
444
|
+
- "https://web.archive.org/web/20130516074518/http://www.jpj.gov.my/web/eng/specifications-of-vehicle-number-plates # JPJ, verbatim: 'Black alphabets and numbers, embossed or glued on a white plate for taxicabs and hired cars.' — the inverted colours, one of only three plate forms JPJ recognises. Accessed 2026-08-02"
|
|
445
|
+
- "https://lom.agc.gov.my/ilims/upload/portal/akta/outputaktap/1871744_BI/Act%20333_Final_15%20Oct%202023%20(25.3.24).pdf # Road Transport Act 1987 s. 66(1)(s), which expressly empowers rules 'to provide for a distinctive registration number or other sign to be carried by public service vehicles or goods vehicles' — the statutory hook for a distinct taxi plate. Accessed 2026-08-02"
|
|
446
|
+
- "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Malaysia # the H (hire) prefix and its state second letters. period_evidence: secondary-wikipedia. Accessed 2026-08-02"
|
|
447
|
+
notes: >-
|
|
448
|
+
TAXIS AND HIRE CARS: black on white, the exact inverse of the ordinary
|
|
449
|
+
plate, and one of the three plate forms JPJ's own specification page
|
|
450
|
+
recognises. The colour inversion is sourced to the authority; the H
|
|
451
|
+
prefix is secondary and is tagged as such inside `format.charset`. Note
|
|
452
|
+
the statutory hook in s. 66(1)(s) — Malaysian law expressly contemplates
|
|
453
|
+
a distinctive number or sign for public service vehicles, which is
|
|
454
|
+
unusually explicit for a common-law road traffic act.
|
|
455
|
+
|
|
456
|
+
- id: my-diplomatic-dc
|
|
457
|
+
class: diplomatic
|
|
458
|
+
categories: [car]
|
|
459
|
+
period: { start: 1987 }
|
|
460
|
+
period_evidence: agency-page-in-force
|
|
461
|
+
matching: strict
|
|
462
|
+
format:
|
|
463
|
+
pattern: "99-99-DC"
|
|
464
|
+
regex: '\A\d{1,3}[- ]\d{1,4}[- ]DC\z'
|
|
465
|
+
pattern_note: >-
|
|
466
|
+
Country code, rank/serial number, and the literal DC. The two numeric
|
|
467
|
+
groups and the DC marking are printed as three groups; the country-code
|
|
468
|
+
group's own table is a RECORDED GAP (PRD-PLATES puts diplomatic decode
|
|
469
|
+
tables at L4) and \d{1,3} is a practical bound, not a sourced one. The
|
|
470
|
+
RANK BLOCK of the second group IS sourced, in detail, and is carried in
|
|
471
|
+
plates/_decode/my-index-marks.yml.
|
|
472
|
+
fields:
|
|
473
|
+
- { name: country_code, note: "the sending state's code — table not located, recorded gap" }
|
|
474
|
+
- { name: rank_number, note: "allocated by diplomatic rank: 01 head of mission's official car, 02/03 head of mission's personal car, 04 deputy chief of mission / deputy high commissioner / minister, 05 minister counsellor, 06-09 counsellor, 10-19 first secretary, 20-29 second secretary, 30-39 third secretary, 40-59 attaché (including military advisers, trade representatives and defence advisers), 60-99 a diplomat's SECOND duty-free car, 101 and above vehicles registered in the name of the mission — Wisma Putra, Protocol Department, paras 6.4, 6.6, 6.8" }
|
|
475
|
+
- { name: marking, value: "DC", note: "Diplomatic Corps" }
|
|
476
|
+
separator_note: "printed as three groups; the regexes spell the gap as an emitted separator class per PRD-PLATES §2.8"
|
|
477
|
+
design:
|
|
478
|
+
background: { color: "#CC0000", finish: non-reflective, hex_basis: observed }
|
|
479
|
+
foreground: "#FFFFFF"
|
|
480
|
+
band: { side: none }
|
|
481
|
+
emblem: { present: false }
|
|
482
|
+
rear_differs: false
|
|
483
|
+
variants:
|
|
484
|
+
- class: diplomatic
|
|
485
|
+
design: { background: { color: "#000000", finish: non-reflective, hex_basis: observed }, foreground: "#FFFFFF" }
|
|
486
|
+
note: >-
|
|
487
|
+
MISSION-REGISTERED VEHICLES GET THE BLACK PLATE, NOT THE RED ONE, and
|
|
488
|
+
this is the distinction most accounts of Malaysian diplomatic plates
|
|
489
|
+
miss. Wisma Putra para 6.9, verbatim: "All motor vehicles for
|
|
490
|
+
diplomats and the Chief Representative from the Regional Office of the
|
|
491
|
+
United Nations will bear WHITE NUMBERS ON RED FIELD with the markings
|
|
492
|
+
of 'DC' or 'UN' respectively." / "All motor vehicles for the foreign
|
|
493
|
+
mission including the consular corps and Offices of the United Nations
|
|
494
|
+
will bear WHITE NUMBERS ON BLACK FIELD with the markings of 'DC', 'CC'
|
|
495
|
+
or 'UN' respectively." So RED means a PERSON (an accredited diplomat);
|
|
496
|
+
BLACK means an INSTITUTION (the mission, the consular corps, a UN
|
|
497
|
+
office). Colour-only variant of the same format and period, hence a
|
|
498
|
+
sub-entry per PRD-PLATES §2.3.
|
|
499
|
+
sources:
|
|
500
|
+
- "https://web.archive.org/web/20140714163606/http://www.kln.gov.my/web/guest/diplomat # Ministry of Foreign Affairs Malaysia, Protocol > Foreign Missions > Diplomat, 'MOTOR VEHICLES' para 6.9 'Colour Identification Of Registration Plate'. Accessed 2026-08-02"
|
|
501
|
+
region_encoding: "plates/_decode/my-index-marks.yml"
|
|
502
|
+
sources:
|
|
503
|
+
- "https://web.archive.org/web/20140714163606/http://www.kln.gov.my/web/guest/diplomat # Ministry of Foreign Affairs Malaysia (Wisma Putra), 'MOTOR VEHICLES' paras 6.4 (the full DC rank allocation table), 6.5 (a diplomat keeps his DC number across vehicles), 6.6 (second car 60-99), 6.7 (chargés d'affaires numbered by rank), 6.8 (mission-registered vehicles from 101), 6.9 (red vs black fields). Accessed 2026-08-02"
|
|
504
|
+
- "https://web.archive.org/web/20130516074518/http://www.jpj.gov.my/web/eng/specifications-of-vehicle-number-plates # JPJ, verbatim: 'White alphabets and numbers, embossed or glued on a red plate for vehicles belonging to embassies, the UN and the International Natural Rubber Association.' — the ROAD AUTHORITY's own statement of the red plate, independent of the foreign ministry's. Accessed 2026-08-02"
|
|
505
|
+
- "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Malaysia # the printed group arrangement 'NN-NN-DC'. period_evidence: secondary-wikipedia. Accessed 2026-08-02"
|
|
506
|
+
notes: >-
|
|
507
|
+
DIPLOMATIC CORPS. TWO INDEPENDENT AUTHORITIES SOURCE THIS PLATE and they
|
|
508
|
+
agree, which is rare: JPJ (the road authority) publishes the red plate as
|
|
509
|
+
one of the three permitted plate forms, and Wisma Putra (the foreign
|
|
510
|
+
ministry) publishes the allocation rules and the red/black split. What is
|
|
511
|
+
sourced: the colours, the red-for-person / black-for-institution rule, and
|
|
512
|
+
the complete RANK-TO-NUMBER table. What is NOT sourced: the country-code
|
|
513
|
+
table and the exact printed group order, which come from secondary
|
|
514
|
+
accounts. Wisma Putra para 6.5 also gives Malaysia a small cherished-number
|
|
515
|
+
rule of its own — a diplomat "is required to retain the number plate even
|
|
516
|
+
when he disposes [of the car] after 18 months or more as the same number
|
|
517
|
+
will be given to his new car".
|
|
518
|
+
|
|
519
|
+
- id: my-consular-cc
|
|
520
|
+
class: consular
|
|
521
|
+
categories: [car]
|
|
522
|
+
period: { start: 1987 }
|
|
523
|
+
period_evidence: agency-page-in-force
|
|
524
|
+
matching: strict
|
|
525
|
+
format:
|
|
526
|
+
pattern: "99-99-CC"
|
|
527
|
+
regex: '\A\d{1,3}[- ]\d{1,4}[- ]CC\z'
|
|
528
|
+
fields:
|
|
529
|
+
- { name: country_code, note: "table not located, recorded gap" }
|
|
530
|
+
- { name: allocation_number, note: "allocated BY CONSULAR DISTRICT, not by rank alone — Kuala Lumpur 01 / 10-19 / 100-199, Penang 02 / 20-29 / 200-299, Kota Bharu 03 / 30-39 / 300-399, Kota Kinabalu 04 / 40-49 / 400-499, Kuching 05 / 50-59 / 500-599, further missions 06-09 / 60-99 / 600-999; the three columns are respectively the head of consular mission, the heads of consular offices, and vehicles registered in the mission's name. Full table in plates/_decode/my-index-marks.yml" }
|
|
531
|
+
- { name: marking, value: "CC", note: "Consular Corps" }
|
|
532
|
+
design:
|
|
533
|
+
background: { color: "#000000", finish: non-reflective, hex_basis: observed }
|
|
534
|
+
foreground: "#FFFFFF"
|
|
535
|
+
band: { side: none }
|
|
536
|
+
emblem: { present: false }
|
|
537
|
+
rear_differs: false
|
|
538
|
+
region_encoding: "plates/_decode/my-index-marks.yml"
|
|
539
|
+
sources:
|
|
540
|
+
- "https://web.archive.org/web/20140714163606/http://www.kln.gov.my/web/guest/diplomat # Wisma Putra 'MOTOR VEHICLES' para 6.10, the full CC allocation table by consular district; para 6.9, consular corps vehicles bear white numbers on a BLACK field. Also: 'Honorary Consuls are only issued with ID cards' — Malaysia gives honorary consuls NO plate at all, in pointed contrast to Thailand's grey honorary-consul plate. Accessed 2026-08-02"
|
|
541
|
+
notes: >-
|
|
542
|
+
CONSULAR CORPS: white on black, marked CC. THE ALLOCATION IS GEOGRAPHIC,
|
|
543
|
+
which makes it a genuine decode dimension rather than a rank code — the
|
|
544
|
+
leading digit of a Malaysian CC number tells you the consular district
|
|
545
|
+
(1 Kuala Lumpur, 2 Penang, 3 Kota Bharu, 4 Kota Kinabalu, 5 Kuching), and
|
|
546
|
+
the magnitude tells you whether the car belongs to the head of mission,
|
|
547
|
+
an office head, or the mission itself. One sentence on the same page is
|
|
548
|
+
worth recording for what it rules OUT: "Honorary Consuls are only issued
|
|
549
|
+
with ID cards" — there is no Malaysian honorary-consul plate.
|
|
550
|
+
|
|
551
|
+
- id: my-un
|
|
552
|
+
class: diplomatic
|
|
553
|
+
categories: [car]
|
|
554
|
+
period: { start: 1987 }
|
|
555
|
+
period_evidence: agency-page-in-force
|
|
556
|
+
# RECALL-ONLY: the printed arrangement of the UN plate is only partly
|
|
557
|
+
# evidenced. Wisma Putra prints its agency allocations as "10 UN", "11 UN",
|
|
558
|
+
# "12 UN", "14 UN" — a single number and the marking — while the personal
|
|
559
|
+
# and office allocations run 01-99 and "101 and above", which implies at
|
|
560
|
+
# least one further group. The regex therefore accepts both a one-group and
|
|
561
|
+
# a two-group form, which makes it wider than any single issuing grammar.
|
|
562
|
+
matching: recall-only
|
|
563
|
+
format:
|
|
564
|
+
pattern: "99 UN"
|
|
565
|
+
regex: '\A\d{1,3}[- ]?\d{0,4}[- ]?UN\z'
|
|
566
|
+
fields:
|
|
567
|
+
- { name: agency_or_country_code, note: "Wisma Putra: UNDP = 10 UN, WHO = 11 UN, FAO = 12 UN, UNHCR = 14 UN — a closed, primary, four-row allocation, carried in plates/_decode/my-index-marks.yml. 13 is skipped and the page does not say why." }
|
|
568
|
+
- { name: allocation_number, note: "01 official car of the head of a UN office or specialised agency; 02-05 that head's personal car; 06-99 cars registered to other UN officials; 101 and above cars registered in the name of the office or agency (Wisma Putra para 6.11)" }
|
|
569
|
+
- { name: marking, value: "UN" }
|
|
570
|
+
design:
|
|
571
|
+
background: { color: "#CC0000", finish: non-reflective, hex_basis: observed }
|
|
572
|
+
foreground: "#FFFFFF"
|
|
573
|
+
band: { side: none }
|
|
574
|
+
emblem: { present: false }
|
|
575
|
+
rear_differs: false
|
|
576
|
+
variants:
|
|
577
|
+
- class: diplomatic
|
|
578
|
+
design: { background: { color: "#000000", finish: non-reflective, hex_basis: observed }, foreground: "#FFFFFF" }
|
|
579
|
+
note: >-
|
|
580
|
+
Offices of the United Nations take the BLACK field; only the Chief
|
|
581
|
+
Representative of the UN Regional Office takes the RED one
|
|
582
|
+
(Wisma Putra para 6.9) — the same person/institution split as DC.
|
|
583
|
+
sources:
|
|
584
|
+
- "https://web.archive.org/web/20140714163606/http://www.kln.gov.my/web/guest/diplomat # para 6.9. Accessed 2026-08-02"
|
|
585
|
+
region_encoding: "plates/_decode/my-index-marks.yml"
|
|
586
|
+
sources:
|
|
587
|
+
- "https://web.archive.org/web/20140714163606/http://www.kln.gov.my/web/guest/diplomat # Wisma Putra 'MOTOR VEHICLES' para 6.11, the UN allocation table and the four named agency numbers (UNDP 10, WHO 11, FAO 12, UNHCR 14); para 6.9 the red/black split. Accessed 2026-08-02"
|
|
588
|
+
- "https://web.archive.org/web/20130516074518/http://www.jpj.gov.my/web/eng/specifications-of-vehicle-number-plates # JPJ lists 'the UN' alongside embassies as entitled to the red plate. Accessed 2026-08-02"
|
|
589
|
+
notes: >-
|
|
590
|
+
UNITED NATIONS OFFICES AND SPECIALISED AGENCIES, marked UN. Malaysia is
|
|
591
|
+
one of few jurisdictions with a distinct UN marking beside DC and CC, and
|
|
592
|
+
the reason is historical: Kuala Lumpur hosted UN regional offices and, on
|
|
593
|
+
JPJ's own account, the INTERNATIONAL NATURAL RUBBER ORGANIZATION, which
|
|
594
|
+
JPJ names in the same breath as the UN when listing who may carry the red
|
|
595
|
+
plate. `matching: recall-only` because the printed group count is not
|
|
596
|
+
fully evidenced — see the comment above the key.
|
|
597
|
+
|
|
598
|
+
- id: my-military-z
|
|
599
|
+
class: military
|
|
600
|
+
categories: [car, van, truck, bus, motorcycle]
|
|
601
|
+
period: { start: 1987 }
|
|
602
|
+
period_evidence: secondary-wikipedia
|
|
603
|
+
matching: strict
|
|
604
|
+
format:
|
|
605
|
+
pattern: "LL 9999"
|
|
606
|
+
regex: '\A[A-Z]{2}[- ]?\d{1,4}\z'
|
|
607
|
+
regex_strict: '\AZ[A-HJ-NP-Y][- ]?[1-9]\d{0,3}\z'
|
|
608
|
+
charset:
|
|
609
|
+
first_letter: [Z]
|
|
610
|
+
note: >-
|
|
611
|
+
Z is reserved to the Malaysian Armed Forces and is issued as no
|
|
612
|
+
state's mark, which is why Z is missing from the ordinary alphabet.
|
|
613
|
+
The second letter advances (ZA, ZB, ZC …). NOT SOURCED TO ANY
|
|
614
|
+
INSTRUMENT OR AUTHORITY PAGE — the reservation is stated by both the
|
|
615
|
+
English and Malay Wikipedia articles ("Huruf Z ditinggalkan dan
|
|
616
|
+
dikhaskan untuk digunakan pada kenderaan tentera Malaysia") and is
|
|
617
|
+
consistent with Z's absence from JPJ's own live area/prefix data.
|
|
618
|
+
separator_note: "a printed gap, optional in the regexes"
|
|
619
|
+
design:
|
|
620
|
+
background: { color: "#000000", finish: non-reflective, hex_basis: observed }
|
|
621
|
+
foreground: "#FFFFFF"
|
|
622
|
+
band: { side: none }
|
|
623
|
+
emblem: { present: false }
|
|
624
|
+
rear_differs: false
|
|
625
|
+
region_encoding: none
|
|
626
|
+
sources:
|
|
627
|
+
- "https://ms.wikipedia.org/wiki/Plat_pendaftaran_kenderaan_Malaysia # 'Huruf Z ditinggalkan dan dikhaskan untuk digunakan pada kenderaan tentera Malaysia' — Z reserved for Malaysian military vehicles. period_evidence: secondary-wikipedia. Accessed 2026-08-02"
|
|
628
|
+
- "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Malaysia # the ZA-prefixed arrangement and the white-on-black plate. period_evidence: secondary-wikipedia. Accessed 2026-08-02"
|
|
629
|
+
- "https://portal-api.jpj.gov.my/api/locations # NEGATIVE evidence, and the honest kind: JPJ's closed list of 32 registration areas contains no Z code, which is consistent with Z being outside the civil registration system entirely. Queried 2026-08-03"
|
|
630
|
+
notes: >-
|
|
631
|
+
MALAYSIAN ARMED FORCES (Angkatan Tentera Malaysia). THE WEAKEST-SOURCED
|
|
632
|
+
SERIES IN THIS FILE and labelled as such: no instrument and no authority
|
|
633
|
+
page located says anything about Z. It is carried because the RESERVATION
|
|
634
|
+
of Z is load-bearing elsewhere — it is why `regex_strict` on every
|
|
635
|
+
civilian series excludes Z — and because omitting it would leave that
|
|
636
|
+
exclusion unexplained. period.start 1987 is the Act in force, carrying no
|
|
637
|
+
claim about when the Z reservation began. A verifier with access to the
|
|
638
|
+
Malaysian Armed Forces' own regulations should expect to replace this
|
|
639
|
+
entry wholesale.
|
|
640
|
+
|
|
641
|
+
- id: my-jpjeplate-ev-2024
|
|
642
|
+
class: electric
|
|
643
|
+
categories: [car]
|
|
644
|
+
period: { start: 2024 }
|
|
645
|
+
period_evidence: secondary-first-issue
|
|
646
|
+
matching: strict
|
|
647
|
+
format:
|
|
648
|
+
pattern: "LLL 9999"
|
|
649
|
+
regex: '\A[A-Z]{1,3}[- ]?\d{1,4}\z'
|
|
650
|
+
regex_strict: '\A[ABCDFJKLMNPQRSTVW][A-HJ-NP-Y]{0,2}[- ]?[1-9]\d{0,3}\z'
|
|
651
|
+
note: >-
|
|
652
|
+
The MARK is an ordinary Malaysian registration — this is a different
|
|
653
|
+
PLATE, not a different numbering system, which is exactly the
|
|
654
|
+
PRD-PLATES §2.3 test for a series of its own (design differs, format
|
|
655
|
+
and period do not).
|
|
656
|
+
design:
|
|
657
|
+
plate_note: >-
|
|
658
|
+
"European-style" proportions are reported by every account and no
|
|
659
|
+
millimetres are sourced; none are recorded here.
|
|
660
|
+
background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
|
|
661
|
+
foreground: "#000000"
|
|
662
|
+
band: { side: left, color: "#009000", content: "green stripe + Jalur Gemilang (national flag) + the international distinguishing code MAL", hex_basis: observed }
|
|
663
|
+
emblem: { present: true, rendered: placeholder, note: "the national flag is a state emblem — PRD-PLATES §3 placeholder rule applies, artwork not reproduced" }
|
|
664
|
+
rear_differs: false
|
|
665
|
+
features: >-
|
|
666
|
+
Embossed characters in FE-Schrift on a white retroreflective ground with
|
|
667
|
+
an embedded RFID tag — the first Malaysian plate to prescribe a
|
|
668
|
+
typeface at all, and the first to leave white-on-black.
|
|
669
|
+
region_encoding: "plates/_decode/my-index-marks.yml"
|
|
670
|
+
sources:
|
|
671
|
+
- "https://soyacincau.com/2024/09/09/jpjeplate-ev-number-plate-malaysia-official-price/ # JPJePlate launch, September 2024: mandatory for newly registered electric cars, European-style plate, black FE-Schrift on white reflective ground, green stripe, Jalur Gemilang, MAL code, embedded RFID. period_evidence: secondary-first-issue. Accessed 2026-08-02"
|
|
672
|
+
- "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Malaysia # 'The JPJePlate number plate was introduced in September 2024 ... compulsory for newly registered EVs from September 2024 onwards. Currently available for Electric powered cars only.' period_evidence: secondary-wikipedia. Accessed 2026-08-02"
|
|
673
|
+
notes: >-
|
|
674
|
+
JPJePLATE, the electric-vehicle plate, mandatory for EVs newly registered
|
|
675
|
+
from September 2024. THE FIRST BREAK IN MALAYSIA'S WHITE-ON-BLACK
|
|
676
|
+
CONVENTION IN THE MODERN ERA, and the first Malaysian plate with a named
|
|
677
|
+
typeface, an international distinguishing code and an RFID tag. ENTIRELY
|
|
678
|
+
SECONDARY-SOURCED: no instrument and no JPJ page carrying its
|
|
679
|
+
specification was located in this pass, and JPJ's own knowledge-base
|
|
680
|
+
article still describes only the three older plate forms. Recorded because
|
|
681
|
+
a current-standard file that omits the current EV plate is incomplete, and
|
|
682
|
+
tagged so a verifier knows precisely how much to re-check. A related 2026
|
|
683
|
+
development — the "Teksi Madani" scheme's red-on-white JPJePlate for taxis
|
|
684
|
+
from 3 July 2026 — is NOT authored here: it rests on a single secondary
|
|
685
|
+
mention and has no located specification.
|