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.
Files changed (186) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +164 -0
  3. data/CHANGELOG.md +274 -0
  4. data/README.md +55 -10
  5. data/data/PROVENANCE-vehicles.md +12 -0
  6. data/data/plates/PROVENANCE.md +5 -4
  7. data/data/plates/_decode/at-districts.yml +287 -0
  8. data/data/plates/_decode/ch-cantons.yml +110 -0
  9. data/data/plates/_decode/cn-issuing-offices.yml +463 -0
  10. data/data/plates/_decode/cn-provinces.yml +614 -0
  11. data/data/plates/_decode/cz-kraj.yml +159 -0
  12. data/data/plates/_decode/dk-serial-blocks.yml +327 -0
  13. data/data/plates/_decode/fr-departements.yml +191 -0
  14. data/data/plates/_decode/gb-age-identifiers.yml +170 -0
  15. data/data/plates/_decode/gb-memory-tags.yml +202 -0
  16. data/data/plates/_decode/gr-prefectures.yml +1408 -0
  17. data/data/plates/_decode/hr-cities.yml +315 -0
  18. data/data/plates/_decode/ie-counties.yml +227 -0
  19. data/data/plates/_decode/in-state-codes.yml +169 -0
  20. data/data/plates/_decode/is-districts-1938.yml +116 -0
  21. data/data/plates/_decode/it-provinces.yml +348 -0
  22. data/data/plates/_decode/jp-office-marks.yml +960 -0
  23. data/data/plates/_decode/jp-use-marks.yml +205 -0
  24. data/data/plates/_decode/kr-authority-marks.yml +146 -0
  25. data/data/plates/_decode/kr-use-syllables.yml +194 -0
  26. data/data/plates/_decode/lu-series-order.yml +638 -0
  27. data/data/plates/_decode/mx-entity-series.yml +380 -0
  28. data/data/plates/_decode/my-index-marks.yml +271 -0
  29. data/data/plates/_decode/no-counties-1913.yml +148 -0
  30. data/data/plates/_decode/no-districts.yml +901 -0
  31. data/data/plates/_decode/pl-powiats.yml +567 -0
  32. data/data/plates/_decode/pt-trailer-services.yml +96 -0
  33. data/data/plates/_decode/ro-counties.yml +213 -0
  34. data/data/plates/_decode/se-diplomatic.yml +220 -0
  35. data/data/plates/_decode/si-regions.yml +123 -0
  36. data/data/plates/_decode/sk-districts.yml +314 -0
  37. data/data/plates/_decode/th-registration-elements.yml +208 -0
  38. data/data/plates/_decode/ua-regions.yml +393 -0
  39. data/data/plates/_decode/za-licence-marks.yml +215 -0
  40. data/data/plates/_meta/classes.yml +1 -0
  41. data/data/plates/_meta/separators.yml +102 -0
  42. data/data/plates/ad.yml +961 -0
  43. data/data/plates/ar.yml +762 -0
  44. data/data/plates/at.yml +1424 -0
  45. data/data/plates/au-act.yml +472 -0
  46. data/data/plates/au-nsw.yml +282 -0
  47. data/data/plates/au-nt.yml +431 -0
  48. data/data/plates/au-qld.yml +272 -0
  49. data/data/plates/au-sa.yml +248 -0
  50. data/data/plates/au-tas.yml +302 -0
  51. data/data/plates/au-vic.yml +215 -0
  52. data/data/plates/au-wa.yml +309 -0
  53. data/data/plates/be.yml +1840 -0
  54. data/data/plates/br.yml +1152 -0
  55. data/data/plates/ca-ab.yml +430 -0
  56. data/data/plates/ca-bc.yml +697 -0
  57. data/data/plates/ca-mb.yml +499 -0
  58. data/data/plates/ca-nb.yml +537 -0
  59. data/data/plates/ca-nl.yml +743 -0
  60. data/data/plates/ca-ns.yml +808 -0
  61. data/data/plates/ca-nt.yml +610 -0
  62. data/data/plates/ca-nu.yml +280 -0
  63. data/data/plates/ca-on.yml +881 -0
  64. data/data/plates/ca-pe.yml +592 -0
  65. data/data/plates/ca-qc.yml +1036 -0
  66. data/data/plates/ca-sk.yml +256 -0
  67. data/data/plates/ca-yt.yml +656 -0
  68. data/data/plates/ch.yml +1273 -0
  69. data/data/plates/cn.yml +1431 -0
  70. data/data/plates/cy.yml +688 -0
  71. data/data/plates/cz.yml +1179 -0
  72. data/data/plates/de.yml +553 -118
  73. data/data/plates/dk.yml +1647 -0
  74. data/data/plates/ee.yml +1275 -0
  75. data/data/plates/es.yml +228 -32
  76. data/data/plates/fi.yml +1271 -0
  77. data/data/plates/fr.yml +1265 -0
  78. data/data/plates/gb.yml +1188 -0
  79. data/data/plates/gr.yml +721 -0
  80. data/data/plates/hr.yml +860 -0
  81. data/data/plates/hu.yml +959 -0
  82. data/data/plates/ie.yml +775 -0
  83. data/data/plates/in.yml +1172 -0
  84. data/data/plates/is.yml +667 -0
  85. data/data/plates/it.yml +1317 -0
  86. data/data/plates/jp.yml +3650 -0
  87. data/data/plates/kr.yml +1375 -0
  88. data/data/plates/li.yml +1010 -0
  89. data/data/plates/lt.yml +879 -0
  90. data/data/plates/lu.yml +842 -0
  91. data/data/plates/lv.yml +924 -0
  92. data/data/plates/mc.yml +1024 -0
  93. data/data/plates/mt.yml +854 -0
  94. data/data/plates/mx.yml +1372 -0
  95. data/data/plates/my.yml +685 -0
  96. data/data/plates/nl.yml +44 -0
  97. data/data/plates/no.yml +1018 -0
  98. data/data/plates/nz.yml +1699 -0
  99. data/data/plates/pl.yml +1296 -0
  100. data/data/plates/pt.yml +847 -0
  101. data/data/plates/ro.yml +785 -0
  102. data/data/plates/se.yml +1091 -0
  103. data/data/plates/si.yml +1105 -0
  104. data/data/plates/sk.yml +1439 -0
  105. data/data/plates/sm.yml +1119 -0
  106. data/data/plates/th.yml +1150 -0
  107. data/data/plates/ua.yml +1672 -0
  108. data/data/plates/us-ak.yml +763 -0
  109. data/data/plates/us-al.yml +457 -0
  110. data/data/plates/us-ar.yml +427 -0
  111. data/data/plates/us-as.yml +454 -0
  112. data/data/plates/us-az.yml +430 -0
  113. data/data/plates/us-ca.yml +892 -0
  114. data/data/plates/us-co.yml +452 -0
  115. data/data/plates/us-ct.yml +427 -0
  116. data/data/plates/us-dc.yml +614 -0
  117. data/data/plates/us-de.yml +551 -0
  118. data/data/plates/us-fl.yml +319 -96
  119. data/data/plates/us-ga.yml +644 -0
  120. data/data/plates/us-gu.yml +658 -0
  121. data/data/plates/us-hi.yml +585 -0
  122. data/data/plates/us-ia.yml +438 -0
  123. data/data/plates/us-id.yml +531 -0
  124. data/data/plates/us-il.yml +516 -0
  125. data/data/plates/us-in.yml +324 -0
  126. data/data/plates/us-ks.yml +351 -0
  127. data/data/plates/us-ky.yml +770 -0
  128. data/data/plates/us-la.yml +568 -0
  129. data/data/plates/us-ma.yml +379 -0
  130. data/data/plates/us-md.yml +536 -0
  131. data/data/plates/us-me.yml +445 -0
  132. data/data/plates/us-mi.yml +408 -0
  133. data/data/plates/us-mn.yml +411 -0
  134. data/data/plates/us-mo.yml +356 -0
  135. data/data/plates/us-mp.yml +402 -0
  136. data/data/plates/us-ms.yml +432 -0
  137. data/data/plates/us-mt.yml +619 -0
  138. data/data/plates/us-nc.yml +602 -0
  139. data/data/plates/us-nd.yml +419 -0
  140. data/data/plates/us-ne.yml +483 -0
  141. data/data/plates/us-nh.yml +394 -0
  142. data/data/plates/us-nj.yml +547 -0
  143. data/data/plates/us-nm.yml +574 -0
  144. data/data/plates/us-nv.yml +655 -0
  145. data/data/plates/us-ny.yml +592 -0
  146. data/data/plates/us-oh.yml +404 -0
  147. data/data/plates/us-ok.yml +513 -0
  148. data/data/plates/us-or.yml +392 -0
  149. data/data/plates/us-pa.yml +506 -0
  150. data/data/plates/us-pr.yml +507 -0
  151. data/data/plates/us-ri.yml +445 -0
  152. data/data/plates/us-sc.yml +605 -0
  153. data/data/plates/us-sd.yml +428 -0
  154. data/data/plates/us-tn.yml +471 -0
  155. data/data/plates/us-tx.yml +535 -0
  156. data/data/plates/us-ut.yml +384 -0
  157. data/data/plates/us-va.yml +567 -0
  158. data/data/plates/us-vi.yml +489 -0
  159. data/data/plates/us-vt.yml +458 -0
  160. data/data/plates/us-wa.yml +484 -0
  161. data/data/plates/us-wi.yml +509 -0
  162. data/data/plates/us-wv.yml +446 -0
  163. data/data/plates/us-wy.yml +523 -0
  164. data/data/plates/va.yml +604 -0
  165. data/data/plates/za.yml +1141 -0
  166. data/data/vehicles.json +160653 -105090
  167. data/lib/vehicles/configuration.rb +17 -3
  168. data/lib/vehicles/dataset.rb +73 -18
  169. data/lib/vehicles/fuzzy.rb +115 -0
  170. data/lib/vehicles/http.rb +48 -0
  171. data/lib/vehicles/make.rb +36 -6
  172. data/lib/vehicles/mcp_server.rb +5 -5
  173. data/lib/vehicles/model.rb +21 -2
  174. data/lib/vehicles/plates/series.rb +172 -18
  175. data/lib/vehicles/plates/template_fill.rb +188 -0
  176. data/lib/vehicles/plates/templates.rb +162 -0
  177. data/lib/vehicles/plates.rb +12 -0
  178. data/lib/vehicles/providers/hosted_provider.rb +28 -55
  179. data/lib/vehicles/validators/vehicle_make_validator.rb +3 -1
  180. data/lib/vehicles/validators/vehicle_model_validator.rb +1 -1
  181. data/lib/vehicles/version.rb +1 -1
  182. data/lib/vehicles.rb +32 -16
  183. data/rakelib/data_refresh.rake +109 -0
  184. data/rakelib/plates_refresh.rake +29 -0
  185. data/sig/vehicles.rbs +18 -0
  186. metadata +164 -2
@@ -0,0 +1,614 @@
1
+ # plates/_decode/cn-provinces.yml — the leading Han character of a Chinese
2
+ # registration number: 省、自治区、直辖市简称, the abbreviation of the province,
3
+ # autonomous region or directly-administered municipality.
4
+ #
5
+ # THE SOURCE FINDING, and it is the same one that makes
6
+ # plates/_decode/cn-issuing-offices.yml possible: THE LIST IS INSIDE THE
7
+ # STANDARD, AND ONE EDITION OF THE STANDARD IS READABLE. GA 36
8
+ # 《中华人民共和国机动车号牌》 is the mandatory public-security industry standard
9
+ # that defines Chinese plates. The CURRENT edition, GA 36-2018, is registered
10
+ # (发布 2018-04-20, 实施 2018-05-01, 代替 GA 36-2014) and its TEXT IS WITHHELD —
11
+ # the register's own reader answers "您所查询的标准在本系统尚未公开,不公开理由
12
+ # 如下:无". The immediately preceding edition GA 36-2007 (发布 2007-09-28,
13
+ # 实施 2007-11-01, 代替 GA 36-1992) is republished IN FULL by a Chinese
14
+ # municipal government, 巩义市人民政府 (www.hngy.gov.cn, 2012-11-15), and that
15
+ # copy survives in the Internet Archive. Every row below is
16
+ # GA 36-2007 § 5.7 表 2《省、自治区、直辖市简称》, read off that copy.
17
+ #
18
+ # § 5.7, verbatim and complete: "省、自治区、直辖市的简称应符合表2的要求。"
19
+ # ("The abbreviations of provinces, autonomous regions and municipalities shall
20
+ # conform to the requirements of Table 2." — translation ours; the Chinese is
21
+ # the sourced text.) Table 2 is printed in two columns of numbered rows, 1 to
22
+ # 31, each row 序号 / 地区名称 / 简称. The rows below are in TABLE 2's OWN
23
+ # NUMBERING, recovered by parsing the two interleaved columns and sorting on
24
+ # 序号 — they are NOT re-ordered alphabetically and NOT taken from any
25
+ # encyclopaedia.
26
+ #
27
+ # NOTHING HERE WAS TYPED BY HAND THAT COULD HAVE BEEN PARSED. The characters,
28
+ # the subdivision names and the row numbers were extracted mechanically from
29
+ # the archived GA 36-2007 text (which is GB18030-encoded and mis-declares
30
+ # itself as UTF-8 — decode it as GB18030 or you will get mojibake and think the
31
+ # page is broken); the codepoints were computed with `ch.ord`. The only
32
+ # hand-added columns are ISO 3166-2, GB/T 2260, pinyin, the English name and
33
+ # the customary-alternate flags.
34
+ #
35
+ # ============================================================================
36
+ # WHY THIS IS A DECODE FILE AND NOT PART OF A REGEX
37
+ # ============================================================================
38
+ # plates/_meta/separators.yml fixes the dataset's serial alphabet, normatively
39
+ # and dataset-wide, as "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", and
40
+ # scripts/lint_plates.rb enforces it on every pattern and regex. A Chinese mark
41
+ # opens with a Han character, and — unlike the Greek case (plates/gr.yml),
42
+ # where Α U+0391 and A U+0041 are the same picture and the Latin form is
43
+ # lossless — there is NO Latin form of 京. "jing" is a reading, not a glyph;
44
+ # no plate, no registry and no ANPR camera ever emits it. So the Han elements
45
+ # are modelled as DATA here and in plates/cn.yml's `format.han`, and the
46
+ # regexes match the Latin-and-digit remainder. plates/cn.yml's header states
47
+ # that division once for the whole jurisdiction.
48
+ #
49
+ # ============================================================================
50
+ # THE TRAP: SIX SUBDIVISIONS HAVE TWO CUSTOMARY ABBREVIATIONS AND TABLE 2
51
+ # PICKS ONE
52
+ # ============================================================================
53
+ # 中国政府网's own 《中华人民共和国行政区划》 page says the abbreviations are
54
+ # customary rather than statutory — "在历史上和习惯上,各省级行政区都有简称"
55
+ # ("historically and by custom, every provincial-level administrative division
56
+ # has an abbreviation") — and custom produced doublets. Table 2 chose:
57
+ #
58
+ # 四川省 川 (Table 2) / 蜀 贵州省 贵 (Table 2) / 黔
59
+ # 云南省 云 (Table 2) / 滇 陕西省 陕 (Table 2) / 秦
60
+ # 甘肃省 甘 (Table 2) / 陇 上海市 沪 (Table 2) / 申
61
+ #
62
+ # A consumer that decodes 蜀, 黔, 滇, 秦, 陇 or 申 as a plate prefix is decoding
63
+ # a character no plate carries. Each is recorded on its row as
64
+ # `customary_alternate_not_on_plates` so the wrong answer cannot be reached
65
+ # from this file and the right one is stated. Note what this costs: the plate
66
+ # character is NOT always the character a Chinese speaker would reach for
67
+ # first, and a translation pipeline that maps 简称 to province by dictionary
68
+ # rather than by this table will disagree with the road.
69
+ #
70
+ # ============================================================================
71
+ # PERIOD DISCIPLINE (PRD-PLATES § 2.4) — ONE ROW IS YOUNGER THAN THE OTHERS
72
+ # ============================================================================
73
+ # GA 36-2007's 前言 lists, among the changes that edition made to GA 36-1992,
74
+ # verbatim: "――增加了重庆的简称;" and "――增加了"渝"、"港"、"澳"、"使"、"警"、
75
+ # "超"等省、自治区、直辖市简称及号牌分类用汉字;" — the 2007 edition ADDED
76
+ # Chongqing's abbreviation 渝, together with the classification characters 港,
77
+ # 澳, 使, 警 and 超. That is exactly what the administrative history predicts:
78
+ # Chongqing was separated from Sichuan and made a directly-administered
79
+ # municipality in 1997, five years after GA 36-1992, so 渝 could not have been
80
+ # in the 1992 table. It is the ONLY row in this file with a different start
81
+ # year, and it is dated on the standard's own foreword rather than on the
82
+ # constitutional change.
83
+ #
84
+ # The other 30 rows run from GA 36-1992 — `period.start: 1992` on this file —
85
+ # and none has been withdrawn: no provincial-level division has been created,
86
+ # merged or abolished since 1997, and the 2014 and 2018 editions' change lists
87
+ # are not public, so no row here can be shown to have changed after 2007.
88
+ jurisdiction: cn
89
+ topic: provinces
90
+ authority:
91
+ name: 公安部 (Ministry of Public Security) — GA 36 《中华人民共和国机动车号牌》 § 5.7 表 2;技术归口 公安部道路交通管理标准化技术委员会
92
+ url: "https://hbba.sacinfo.org.cn/stdDetail/328b77ee80fdee1dee33d20e83d01d2ad128f380aa93c7dbe5c58c67d9d2075e"
93
+ sources:
94
+ - "https://web.archive.org/web/20150701102419/http://www.hngy.gov.cn/sitepublish/site1/wsbs/lyfwzl/jtfw/jdc/jdcfw/content_25106.html # GA 36-2007 《中华人民共和国机动车号牌》 FULL TEXT as republished by 巩义市人民政府 (published 2012-11-15): § 5.7 and 表 2 省、自治区、直辖市简称 — all 31 rows below, in the table's own 序号 order; § 5.10 号牌分类用汉字 — the classification characters listed under `classification_han`; § 5.11 间隔符; the 前言 change list carrying the 渝 addition. Note the page is GB18030 mis-declared as UTF-8. Accessed 2026-08-02"
95
+ - "https://hbba.sacinfo.org.cn/stdDetail/12b7710b682f0e13dfc423a325751920 # 全国标准信息公共服务平台 register entry for GA 36-2007: 发布 2007-09-28, 实施 2007-11-01, 代替 GA 36-1992, 状态 废止 — the provenance of the text above, and the evidence that GA 36-1992 existed. Accessed 2026-08-02"
96
+ - "https://hbba.sacinfo.org.cn/stdDetail/328b77ee80fdee1dee33d20e83d01d2ad128f380aa93c7dbe5c58c67d9d2075e # register entry for the CURRENT GA 36-2018: 发布 2018-04-20, 实施 2018-05-01, 代替 GA 36-2014. Metadata only — the text is withheld ('尚未公开'), so this table cannot be re-verified against the edition actually in force. Accessed 2026-08-02"
97
+ - "https://web.archive.org/web/20240222001221/https://www.gov.cn/test/2005-06/15/content_18253.htm # 中国政府网 《中华人民共和国行政区划》: the 34 provincial-level divisions and, verbatim, '在历史上和习惯上,各省级行政区都有简称' — the abbreviations are CUSTOMARY, which is why they live in a public-security standard and in no statute. Live URL 404s; read from the Internet Archive. Accessed 2026-08-02"
98
+ - "https://www.gov.cn/zhengce/content/2018-12/11/content_5347765.htm # 国办发〔2018〕114号 附件 一(一): the worked examples '京·12345应急' and '京·X2345应急', glossing the second as 北京市应急管理部门 — an independent instrument showing a Table 2 character IN USE on a plate with its subdivision named. Accessed 2026-08-02"
99
+ period: { start: 1992 }
100
+ period_evidence: enabling-instrument
101
+ period_note: >-
102
+ 1992 is GA 36-1992, the edition that created the 92-pattern mark this table
103
+ belongs to; its existence is evidenced by GA 36-2007's 前言 ("本标准代替
104
+ GA36-1992") and by the register's 代替标准 field, and no 发布/实施 date for it
105
+ could be pinned because it predates the industry-standard filing database.
106
+ ONE ROW IS YOUNGER: 渝 (Chongqing) was added by the 2007 edition and carries
107
+ `row_period_start: 2007` with the foreword quoted on it. The widely repeated
108
+ claim that the 92-pattern was trialled in 1992 and rolled out nationwide in
109
+ July 1994 is NOT asserted here or in plates/cn.yml — see the dossier's
110
+ folklore section.
111
+ decode_direction: "leading Han character -> the provincial-level division whose vehicle-management office issued the mark"
112
+ split_note: >-
113
+ FIXED WIDTH, AND THE CLEANEST SPLIT IN THIS DATASET. The province character
114
+ is always exactly ONE character and always the FIRST character of the mark,
115
+ immediately followed by the single Latin issuing-office letter. A consumer
116
+ takes `mark[0]`, looks it up here, and hands the remainder to
117
+ plates/cn.yml's regexes — there is no greedy-match problem and no ambiguity
118
+ with the Latin tail, because the two alphabets are disjoint by construction.
119
+ TWO EXCEPTIONS, both instrument-sourced and both recorded below in
120
+ `classification_han`: the embassy mark opens with 使 instead of a province
121
+ character (GA 36-2007 § 5.10), and the emergency-rescue MOTORCYCLE mark opens
122
+ with the two-character pair 应急 before its province character
123
+ (国办发〔2018〕114号 附件 一(二)).
124
+ scope_note: >-
125
+ HONG KONG, MACAU AND TAIWAN HAVE NO ROW, and their absence is the standard's,
126
+ not ours: Table 2 has exactly 31 rows and stops at 新疆维吾尔自治区. 港 and 澳
127
+ DO appear in GA 36-2007 — but as CLASSIFICATION characters under § 5.10, on
128
+ the mainland-side plate a Hong Kong or Macau cross-boundary vehicle carries,
129
+ not as province prefixes. They are recorded under `classification_han` for
130
+ that reason, and Hong Kong (ISO 3166-1 HK) and Macau (MO) are separate
131
+ jurisdictions in this dataset with their own files.
132
+
133
+ # ---------------------------------------------------------------------------
134
+ # GA 36-2007 § 5.7 表 2《省、自治区、直辖市简称》 — all 31 rows, in the
135
+ # table's own 序号 order. Characters, names and row numbers parsed from the
136
+ # archived instrument text; codepoints computed with ch.ord.
137
+ # ---------------------------------------------------------------------------
138
+ rows:
139
+ - table2_row: 1
140
+ char: "京"
141
+ codepoint: "U+4EAC"
142
+ pinyin: jing
143
+ subdivision_zh: "北京市"
144
+ subdivision_en: "Beijing Municipality"
145
+ subdivision_type: municipality
146
+ iso_3166_2: CN-BJ
147
+ gbt_2260: "110000"
148
+ - table2_row: 2
149
+ char: "津"
150
+ codepoint: "U+6D25"
151
+ pinyin: jin
152
+ subdivision_zh: "天津市"
153
+ subdivision_en: "Tianjin Municipality"
154
+ subdivision_type: municipality
155
+ iso_3166_2: CN-TJ
156
+ gbt_2260: "120000"
157
+ - table2_row: 3
158
+ char: "冀"
159
+ codepoint: "U+5180"
160
+ pinyin: ji
161
+ subdivision_zh: "河北省"
162
+ subdivision_en: "Hebei Province"
163
+ subdivision_type: province
164
+ iso_3166_2: CN-HE
165
+ gbt_2260: "130000"
166
+ - table2_row: 4
167
+ char: "晋"
168
+ codepoint: "U+664B"
169
+ pinyin: jin
170
+ subdivision_zh: "山西省"
171
+ subdivision_en: "Shanxi Province"
172
+ subdivision_type: province
173
+ iso_3166_2: CN-SX
174
+ gbt_2260: "140000"
175
+ - table2_row: 5
176
+ char: "蒙"
177
+ codepoint: "U+8499"
178
+ pinyin: meng
179
+ subdivision_zh: "内蒙古自治区"
180
+ subdivision_en: "Inner Mongolia Autonomous Region"
181
+ subdivision_type: autonomous-region
182
+ iso_3166_2: CN-NM
183
+ gbt_2260: "150000"
184
+ - table2_row: 6
185
+ char: "辽"
186
+ codepoint: "U+8FBD"
187
+ pinyin: liao
188
+ subdivision_zh: "辽宁省"
189
+ subdivision_en: "Liaoning Province"
190
+ subdivision_type: province
191
+ iso_3166_2: CN-LN
192
+ gbt_2260: "210000"
193
+ - table2_row: 7
194
+ char: "吉"
195
+ codepoint: "U+5409"
196
+ pinyin: ji
197
+ subdivision_zh: "吉林省"
198
+ subdivision_en: "Jilin Province"
199
+ subdivision_type: province
200
+ iso_3166_2: CN-JL
201
+ gbt_2260: "220000"
202
+ - table2_row: 8
203
+ char: "黑"
204
+ codepoint: "U+9ED1"
205
+ pinyin: hei
206
+ subdivision_zh: "黑龙江省"
207
+ subdivision_en: "Heilongjiang Province"
208
+ subdivision_type: province
209
+ iso_3166_2: CN-HL
210
+ gbt_2260: "230000"
211
+ - table2_row: 9
212
+ char: "沪"
213
+ codepoint: "U+6CAA"
214
+ pinyin: hu
215
+ subdivision_zh: "上海市"
216
+ subdivision_en: "Shanghai Municipality"
217
+ subdivision_type: municipality
218
+ iso_3166_2: CN-SH
219
+ gbt_2260: "310000"
220
+ customary_alternate_not_on_plates:
221
+ - { char: "申", codepoint: "U+7533" }
222
+ - table2_row: 10
223
+ char: "苏"
224
+ codepoint: "U+82CF"
225
+ pinyin: su
226
+ subdivision_zh: "江苏省"
227
+ subdivision_en: "Jiangsu Province"
228
+ subdivision_type: province
229
+ iso_3166_2: CN-JS
230
+ gbt_2260: "320000"
231
+ - table2_row: 11
232
+ char: "浙"
233
+ codepoint: "U+6D59"
234
+ pinyin: zhe
235
+ subdivision_zh: "浙江省"
236
+ subdivision_en: "Zhejiang Province"
237
+ subdivision_type: province
238
+ iso_3166_2: CN-ZJ
239
+ gbt_2260: "330000"
240
+ - table2_row: 12
241
+ char: "皖"
242
+ codepoint: "U+7696"
243
+ pinyin: wan
244
+ subdivision_zh: "安徽省"
245
+ subdivision_en: "Anhui Province"
246
+ subdivision_type: province
247
+ iso_3166_2: CN-AH
248
+ gbt_2260: "340000"
249
+ - table2_row: 13
250
+ char: "闽"
251
+ codepoint: "U+95FD"
252
+ pinyin: min
253
+ subdivision_zh: "福建省"
254
+ subdivision_en: "Fujian Province"
255
+ subdivision_type: province
256
+ iso_3166_2: CN-FJ
257
+ gbt_2260: "350000"
258
+ - table2_row: 14
259
+ char: "赣"
260
+ codepoint: "U+8D63"
261
+ pinyin: gan
262
+ subdivision_zh: "江西省"
263
+ subdivision_en: "Jiangxi Province"
264
+ subdivision_type: province
265
+ iso_3166_2: CN-JX
266
+ gbt_2260: "360000"
267
+ - table2_row: 15
268
+ char: "鲁"
269
+ codepoint: "U+9C81"
270
+ pinyin: lu
271
+ subdivision_zh: "山东省"
272
+ subdivision_en: "Shandong Province"
273
+ subdivision_type: province
274
+ iso_3166_2: CN-SD
275
+ gbt_2260: "370000"
276
+ - table2_row: 16
277
+ char: "豫"
278
+ codepoint: "U+8C6B"
279
+ pinyin: yu
280
+ subdivision_zh: "河南省"
281
+ subdivision_en: "Henan Province"
282
+ subdivision_type: province
283
+ iso_3166_2: CN-HA
284
+ gbt_2260: "410000"
285
+ - table2_row: 17
286
+ char: "鄂"
287
+ codepoint: "U+9102"
288
+ pinyin: e
289
+ subdivision_zh: "湖北省"
290
+ subdivision_en: "Hubei Province"
291
+ subdivision_type: province
292
+ iso_3166_2: CN-HB
293
+ gbt_2260: "420000"
294
+ - table2_row: 18
295
+ char: "湘"
296
+ codepoint: "U+6E58"
297
+ pinyin: xiang
298
+ subdivision_zh: "湖南省"
299
+ subdivision_en: "Hunan Province"
300
+ subdivision_type: province
301
+ iso_3166_2: CN-HN
302
+ gbt_2260: "430000"
303
+ - table2_row: 19
304
+ char: "粤"
305
+ codepoint: "U+7CA4"
306
+ pinyin: yue
307
+ subdivision_zh: "广东省"
308
+ subdivision_en: "Guangdong Province"
309
+ subdivision_type: province
310
+ iso_3166_2: CN-GD
311
+ gbt_2260: "440000"
312
+ - table2_row: 20
313
+ char: "桂"
314
+ codepoint: "U+6842"
315
+ pinyin: gui
316
+ subdivision_zh: "广西壮族自治区"
317
+ subdivision_en: "Guangxi Zhuang Autonomous Region"
318
+ subdivision_type: autonomous-region
319
+ iso_3166_2: CN-GX
320
+ gbt_2260: "450000"
321
+ - table2_row: 21
322
+ char: "琼"
323
+ codepoint: "U+743C"
324
+ pinyin: qiong
325
+ subdivision_zh: "海南省"
326
+ subdivision_en: "Hainan Province"
327
+ subdivision_type: province
328
+ iso_3166_2: CN-HI
329
+ gbt_2260: "460000"
330
+ - table2_row: 22
331
+ char: "渝"
332
+ codepoint: "U+6E1D"
333
+ pinyin: yu
334
+ subdivision_zh: "重庆市"
335
+ subdivision_en: "Chongqing Municipality"
336
+ subdivision_type: municipality
337
+ iso_3166_2: CN-CQ
338
+ gbt_2260: "500000"
339
+ row_period_start: 2007
340
+ row_period_note: "GA 36-2007 前言, verbatim: “――增加了重庆的简称;” — 渝 was ADDED by the 2007 edition, which is what the administrative history predicts: Chongqing was separated from Sichuan and made a directly-administered municipality in 1997, five years after GA 36-1992. The only row in this table with a start year of its own."
341
+ - table2_row: 23
342
+ char: "川"
343
+ codepoint: "U+5DDD"
344
+ pinyin: chuan
345
+ subdivision_zh: "四川省"
346
+ subdivision_en: "Sichuan Province"
347
+ subdivision_type: province
348
+ iso_3166_2: CN-SC
349
+ gbt_2260: "510000"
350
+ customary_alternate_not_on_plates:
351
+ - { char: "蜀", codepoint: "U+8700" }
352
+ - table2_row: 24
353
+ char: "贵"
354
+ codepoint: "U+8D35"
355
+ pinyin: gui
356
+ subdivision_zh: "贵州省"
357
+ subdivision_en: "Guizhou Province"
358
+ subdivision_type: province
359
+ iso_3166_2: CN-GZ
360
+ gbt_2260: "520000"
361
+ customary_alternate_not_on_plates:
362
+ - { char: "黔", codepoint: "U+9ED4" }
363
+ - table2_row: 25
364
+ char: "云"
365
+ codepoint: "U+4E91"
366
+ pinyin: yun
367
+ subdivision_zh: "云南省"
368
+ subdivision_en: "Yunnan Province"
369
+ subdivision_type: province
370
+ iso_3166_2: CN-YN
371
+ gbt_2260: "530000"
372
+ customary_alternate_not_on_plates:
373
+ - { char: "滇", codepoint: "U+6EC7" }
374
+ - table2_row: 26
375
+ char: "藏"
376
+ codepoint: "U+85CF"
377
+ pinyin: zang
378
+ subdivision_zh: "西藏自治区"
379
+ subdivision_en: "Xizang (Tibet) Autonomous Region"
380
+ subdivision_type: autonomous-region
381
+ iso_3166_2: CN-XZ
382
+ gbt_2260: "540000"
383
+ - table2_row: 27
384
+ char: "陕"
385
+ codepoint: "U+9655"
386
+ pinyin: shan
387
+ subdivision_zh: "陕西省"
388
+ subdivision_en: "Shaanxi Province"
389
+ subdivision_type: province
390
+ iso_3166_2: CN-SN
391
+ gbt_2260: "610000"
392
+ customary_alternate_not_on_plates:
393
+ - { char: "秦", codepoint: "U+79E6" }
394
+ - table2_row: 28
395
+ char: "甘"
396
+ codepoint: "U+7518"
397
+ pinyin: gan
398
+ subdivision_zh: "甘肃省"
399
+ subdivision_en: "Gansu Province"
400
+ subdivision_type: province
401
+ iso_3166_2: CN-GS
402
+ gbt_2260: "620000"
403
+ customary_alternate_not_on_plates:
404
+ - { char: "陇", codepoint: "U+9647" }
405
+ - table2_row: 29
406
+ char: "青"
407
+ codepoint: "U+9752"
408
+ pinyin: qing
409
+ subdivision_zh: "青海省"
410
+ subdivision_en: "Qinghai Province"
411
+ subdivision_type: province
412
+ iso_3166_2: CN-QH
413
+ gbt_2260: "630000"
414
+ - table2_row: 30
415
+ char: "宁"
416
+ codepoint: "U+5B81"
417
+ pinyin: ning
418
+ subdivision_zh: "宁夏回族自治区"
419
+ subdivision_en: "Ningxia Hui Autonomous Region"
420
+ subdivision_type: autonomous-region
421
+ iso_3166_2: CN-NX
422
+ gbt_2260: "640000"
423
+ - table2_row: 31
424
+ char: "新"
425
+ codepoint: "U+65B0"
426
+ pinyin: xin
427
+ subdivision_zh: "新疆维吾尔自治区"
428
+ subdivision_en: "Xinjiang Uygur Autonomous Region"
429
+ subdivision_type: autonomous-region
430
+ iso_3166_2: CN-XJ
431
+ gbt_2260: "650000"
432
+
433
+ # ---------------------------------------------------------------------------
434
+ # 号牌分类用汉字 — THE CLASSIFICATION CHARACTERS
435
+ #
436
+ # GA 36-2007 § 5.10, verbatim and complete (one sentence, nine clauses):
437
+ #
438
+ # "领馆汽车号牌和摩托车号牌的机动车登记编号中使用汉字简称"领"字;使馆汽车
439
+ # 号牌和摩托车号牌的机动车登记编号中使用汉字简称"使"字;警用汽车号牌和摩托车
440
+ # 号牌的机动车登记编号使用汉字简称"警"字;教练汽车号牌和摩托车号牌的机动车
441
+ # 登记编号中使用汉字简称"学"字;挂车号牌的机动车登记编号使用汉字简称"挂"字;
442
+ # 香港特别行政区入出内地车辆号牌的机动车登记编号使用汉字简称"港"字;澳门
443
+ # 特别行政区入出内地车辆号牌的机动车登记编号使用汉字简称"澳"字;试验车的临时
444
+ # 行驶车号牌的机动车登记编号中使用汉字简称"试"字;特型车的临时行驶车号牌的
445
+ # 机动车登记编号中使用汉字简称"超"字。"
446
+ #
447
+ # Nine characters, each bound to a named plate class by the standard itself.
448
+ # This is the fourth element of GA 36-2007 § 3.2's four-element registration
449
+ # number, and it is why a Chinese mark can be bracketed by Han characters at
450
+ # both ends. The 应急 pair is NOT in this list — it postdates GA 36-2007 by
451
+ # eleven years and comes from a State Council instrument instead.
452
+ #
453
+ # POSITION IS NOT UNIFORM AND § 5.10 DOES NOT STATE IT. The standard says which
454
+ # character each class uses and not where it sits; 使 leads and the rest trail,
455
+ # which is recorded per row from plates/cn.yml's series and flagged where it
456
+ # rests on anything weaker than an instrument.
457
+ # ---------------------------------------------------------------------------
458
+ classification_han:
459
+ - char: "领"
460
+ codepoint: "U+9886"
461
+ pinyin: ling
462
+ position: trailing
463
+ class_zh: 领馆汽车号牌和摩托车号牌
464
+ class_en: "consular post — car and motorcycle plates"
465
+ evidence: enabling-instrument
466
+ row_period_start: 1992
467
+ - char: "使"
468
+ codepoint: "U+4F7F"
469
+ pinyin: shi
470
+ position: leading
471
+ position_note: >-
472
+ THE ONE CLASSIFICATION CHARACTER THAT REPLACES THE PROVINCE CHARACTER
473
+ rather than following the serial: an embassy mark carries no geography at
474
+ all. § 5.10 does not say so in terms; the position is taken from
475
+ GA 36-2007's own 附录 C 号牌效果图 and from plates/cn.yml's embassy series.
476
+ class_zh: 使馆汽车号牌和摩托车号牌
477
+ class_en: "diplomatic mission (embassy) — car and motorcycle plates"
478
+ evidence: enabling-instrument
479
+ row_period_start: 2007
480
+ row_period_note: >-
481
+ GA 36-2007 前言, verbatim: "――增加了"渝"、"港"、"澳"、"使"、"警"、"超"等
482
+ 省、自治区、直辖市简称及号牌分类用汉字;" — 使 was ADDED by the 2007
483
+ edition. A pre-2007 embassy mark used a different construction and this
484
+ pass located no primary describing it.
485
+ - char: "警"
486
+ codepoint: "U+8B66"
487
+ pinyin: jing
488
+ position: trailing
489
+ class_zh: 警用汽车号牌和摩托车号牌
490
+ class_en: "police — car and motorcycle plates"
491
+ evidence: enabling-instrument
492
+ row_period_start: 2007
493
+ row_period_note: >-
494
+ Added by the 2007 edition, and the foreword says so twice: the change list
495
+ carries both "――增加了警用汽车号牌和警用摩托车号牌式样;" and the 警
496
+ character in the classification-character line quoted above. The class and
497
+ its character arrived together in GA 36-2007.
498
+ - char: "学"
499
+ codepoint: "U+5B66"
500
+ pinyin: xue
501
+ position: trailing
502
+ class_zh: 教练汽车号牌和摩托车号牌
503
+ class_en: "driving-school (learner) — car and motorcycle plates"
504
+ evidence: enabling-instrument
505
+ row_period_start: 1992
506
+ - char: "挂"
507
+ codepoint: "U+6302"
508
+ pinyin: gua
509
+ position: trailing
510
+ class_zh: 挂车号牌
511
+ class_en: "trailer"
512
+ evidence: enabling-instrument
513
+ row_period_start: 1992
514
+ - char: "港"
515
+ codepoint: "U+6E2F"
516
+ pinyin: gang
517
+ position: trailing
518
+ class_zh: 香港特别行政区入出内地车辆号牌
519
+ class_en: "Hong Kong SAR vehicle entering and leaving the mainland — mainland-side plate"
520
+ evidence: enabling-instrument
521
+ row_period_start: 2007
522
+ row_period_note: "added by the 2007 edition (前言, the same change line as 使 and 警) — which fits: the Hong Kong SAR was established in 1997, after GA 36-1992"
523
+ - char: "澳"
524
+ codepoint: "U+6FB3"
525
+ pinyin: ao
526
+ position: trailing
527
+ class_zh: 澳门特别行政区入出内地车辆号牌
528
+ class_en: "Macau SAR vehicle entering and leaving the mainland — mainland-side plate"
529
+ evidence: enabling-instrument
530
+ row_period_start: 2007
531
+ row_period_note: "added by the 2007 edition; the Macau SAR was established in 1999, after GA 36-1992"
532
+ - char: "试"
533
+ codepoint: "U+8BD5"
534
+ pinyin: shi
535
+ position: trailing
536
+ class_zh: 试验车的临时行驶车号牌
537
+ class_en: "temporary-movement plate for a test vehicle"
538
+ evidence: enabling-instrument
539
+ row_period_start: 1992
540
+ - char: "超"
541
+ codepoint: "U+8D85"
542
+ pinyin: chao
543
+ position: trailing
544
+ class_zh: 特型车的临时行驶车号牌
545
+ class_en: "temporary-movement plate for an over-dimension vehicle"
546
+ evidence: enabling-instrument
547
+ row_period_start: 2007
548
+ row_period_note: "added by the 2007 edition (前言, same change line)"
549
+ - token: "应急"
550
+ chars: ["应", "急"]
551
+ codepoints: ["U+5E94", "U+6025"]
552
+ pinyin: yingji
553
+ position: "trailing on the car plate, LEADING on the motorcycle plate"
554
+ class_zh: 应急救援专用号牌
555
+ class_en: "emergency rescue — national comprehensive fire-and-rescue force"
556
+ evidence: enabling-instrument
557
+ row_period_start: 2018
558
+ row_period_note: >-
559
+ NOT IN GA 36-2007 § 5.10 — it postdates that edition by eleven years and
560
+ arrives from a State Council instrument rather than from the standard.
561
+ 国办发〔2018〕114号 附件 一(一), verbatim: "字符共8位,依次为省(自治区、
562
+ 直辖市)汉字简称、所属救援队伍代号、四位序号和汉字"应急"组成"; 附件 一(二)
563
+ for the motorcycle: "字符共7位,依次为汉字"应急"、省(自治区、直辖市)汉字
564
+ 简称、三位序号和所属救援队伍代号组成". It is the only TWO-character
565
+ classification token in the system and the only one that leads on one
566
+ plate and trails on another.
567
+ source: "https://www.gov.cn/zhengce/content/2018-12/11/content_5347765.htm # 国办发〔2018〕114号, 成文 2018-12-04, 发布 2018-12-11. Accessed 2026-08-02"
568
+ classification_han_source: "https://web.archive.org/web/20150701102419/http://www.hngy.gov.cn/sitepublish/site1/wsbs/lyfwzl/jtfw/jdc/jdcfw/content_25106.html # GA 36-2007 § 5.10 for the nine standard characters and 前言 for the 2007 additions. Accessed 2026-08-02"
569
+
570
+ # ---------------------------------------------------------------------------
571
+ # What this table does NOT decode, said plainly so no consumer assumes it does.
572
+ # ---------------------------------------------------------------------------
573
+ limits:
574
+ not_a_location: >-
575
+ The character names the provincial-level division of the ISSUING vehicle-
576
+ management office, fixed at registration. It is not where the vehicle is,
577
+ not where the keeper lives now, and not where the vehicle was built. A
578
+ Geoguessr-style or insurance use that reads it as a current-location signal
579
+ is reading it wrong, and a parse API must say so.
580
+ not_a_city: >-
581
+ The city lives in the SECOND character — the 发牌机关代号 — and that table
582
+ is plates/_decode/cn-issuing-offices.yml, which is a 2007 snapshot of an
583
+ open allocation (GA 36-2007 § 5.8.3 lets a new code be brought into use at
584
+ any time with MPS approval). Decoding a province from this file is safe;
585
+ decoding a city needs that file and its cautions.
586
+ no_date: >-
587
+ A Chinese mark encodes NO date anywhere. There is no age identifier, no
588
+ six-month letter, no year block — and since 《机动车登记规定》第四十三条
589
+ lets an owner self-compose the serial inside the published rules, even
590
+ serial-order era inference is unsafe. This is the sharpest contrast in the
591
+ dataset with the British mark, which names the six-month period of first
592
+ registration to 2050.
593
+ cross_file_divergences: >-
594
+ RECORDED, NOT AVERAGED (PRD-PLATES § 5.3). Two `row_period_start` values in
595
+ `classification_han` above disagree with the period on the plates/cn.yml
596
+ series that uses the same character, and the disagreement is left standing
597
+ for the verifier rather than reconciled by one file overwriting the other.
598
+ (1) 使 — this file dates it 2007 on GA 36-2007's 前言, which lists 使 among
599
+ the classification characters that edition ADDED; plates/cn.yml dates
600
+ `cn-embassy-car-1992` and `cn-embassy-motorcycle-1992` to 1992 with
601
+ `period_evidence: instrument-in-force`. Both can be true at once — an
602
+ embassy plate almost certainly existed before 2007 in a construction the
603
+ 2007 edition then standardised — but nothing secured by either pass proves
604
+ it, and the foreword is the harder evidence. (2) 超 — this file dates it
605
+ 2007 on the same foreword line; plates/cn.yml carries it as one of the two
606
+ suffixes on `cn-temporary-travel-1992`, whose other suffix 试 is a 1992
607
+ character. A verifier resolving these should either split the affected
608
+ series or move the starts, and should say which in the PR.
609
+ edition_caveat: >-
610
+ Every row is GA 36-2007's Table 2. GA 36-2014 and GA 36-2018 each reissued
611
+ the standard and neither text is public, so this table cannot be re-verified
612
+ against the edition actually in force. No provincial-level division has been
613
+ created, merged or abolished since 1997, so the risk of a stale row is
614
+ genuinely low — but it is a risk, and it is stated rather than assumed away.