#概要
ブラウザ版GoogelaマップのURLには'!'で区切られた謎パラメータ群が付いてくることがよくあります。
例えばこんなのです:
このURLの"data="以降がこの記事で対象にするパラメータブロック部分です。
!3m2!4b1!5s0x60188b77a7f6fcf5:0x60c9ffa23520351!4m5!3m4!1s0x60188b770913970d:0xccc3467fcb15b353!8m2!3d35.660411!4d139.729265
いったいこのURLは何を言っているのか、気になる人には非常に気になり、気にならない人には本当にどうでもいい事柄かと思いますが、私気になりますので調べました。
この呪文に行きあたって心が折れた人の支えになれれば幸いです。
#注意
この記事ではパラメータブロックの構文のみに注目しています。
パラメータブロックが指し示す意味や動作については言及しませんので、悪しからずご了承ください。
また、記載内容は私が勝手に推測したものです。間違っている可能性もあることに留意してください。
#正体
インデックス、型、値で構成される要素の配列を表現しています。配列は入れ子構造を取ることができます。
最上位にルート配列が存在します。
上記の例ですと、
!3m2!4b1!5s0x60188b77a7f6fcf5:0x60c9ffa23520351!4m5!3m4!1s0x60188b770913970d:0xccc3467fcb15b353!8m2!3d35.660411!4d139.729265
これは次のように展開されます:
!3m2
!4b1
!5s0x60188b77a7f6fcf5:0x60c9ffa23520351
!4m5
!3m4
!1s0x60188b770913970d:0xccc3467fcb15b353
!8m2
!3d35.660411
!4d139.729265
長い行も短い行もありますが、すべて1行1要素で記述してあります。
要素は全てインデックスと型と値を持ち、型に応じて値の記述フォーマットが変わってきます。
#要素
要素は全て次の構文で構成されます。例外は確認していません。
! + インデックス(整数) + 型(英字1文字) + 値(文字列)
各部の連結部にスペースなどを含むことは許されません。
インデックスは正の整数のみが許されるものと思われます。0以下の値は確認していません。
型の大文字小文字は区別されます。確認されている例ではすべて英小文字です。
##例
要素 | インデックス | 型 | 値 |
---|---|---|---|
!3m2 | 3 | m(配列) | 2(続く2要素が配列に含まれる) |
!4b1 | 4 | b(論理値) | 1(true) |
!5s0x6018... | 5 | s(文字列) | 0x6018... |
!4m5 | 4 | m(配列) | 5(続く5要素が配列に含まれる) |
!3m4 | 3 | m(配列) | 4(続く4要素が配列に含まれる) |
!1s0x6018... | 1 | s(文字列) | 0x6018... |
!8m2 | 8 | m(配列) | 2(続く2要素が配列に含まれる) |
!3d35.660411 | 3 | d(実数) | 35.660411 |
!4d139.729265 | 4 | d(実数) | 139.729265 |
#インデックス
配列の添字とは異なります。構文的には重複が許され、インデックスの重複するすべての要素が有効です。
ただし解釈する側で取捨される状況はあり得ます。
列挙型の要素が同じインデックスで並ぶ例はよく見られます。
インデックスの数値が連続する必要はなく、数値の大小関係に従った並び順も(おそらく)求められません。
#型と値
一覧を次に示します:
型 | 値 | 備考 |
---|---|---|
m | 配列要素数(0以上の整数) | 値は後に続く要素数を示す 子配列の要素数も含むことに注意 |
b | 真偽値 (0=偽,1=真,それ以外もたぶん真) |
|
i | 整数 | |
d | 実数 | |
e | 列挙値(整数) | |
u | 符号なし整数? | 見かけたことがあるような気がする |
h | 16進数 | 見かけたことがあるような気がする。 "0x"のような接頭詞は付かなかったような気がする |
s | 文字列 | 原則的にはURIエンコードされている たまに'+'をスペースにデコードしない受け手の処理系があるので注意 (その場合は%20でエンコードする) |
z | 文字列? | たまにある。sとの違いは不明 |
##配列
'm'で示される配列要素の注意点を挙げます。
###要素数の解釈
要素数は子配列の要素数も含みます。
!1m3!2m2!3i0!4i0!5i0!6i0!7i0
というパラメータブロックがあった場合、
次の解釈は間違いです:
!1m4
!2m2 //1m4の要素1
!3i0
!4i0
!5i0 //1m4の要素2
!6i0 //1m4の要素3
!7i0 //1m4の要素4
正しい解釈は次の通りです:
!1m4
!2m2
!3i0
!4i0
!5i0 //ここまでの4要素が!1m4の下に付く
!6i0
!7i0
正しく生成されたパラメータブロックであれば、ネストした配列要素数の帳尻は合うはずです。
#要素数0の配列
あり得ます。実例も確認されています。
!1m0!2m2!3i0!4i0
というパラメータブロックはルール通りに次のように解釈されます:
!1m0
!2m2
!3i0
!4i0
#所感
ほんとに誰得な情報ですが、これと格闘する羽目になった場合にパーサーを書くのは結構楽しい作業になります。お勧めです。