名前と識別子 - TakashiSasaki/zmbatml GitHub Wiki
名前とは何か。一般的にはあるものがそれと識別できるような文字列である。 では識別子とは何か。これもまた文字列であろう。 ある文字列がただの名前であるか識別子であるかを判定することは難しい。 例えばファイル名は名前であるがそれがパスの一部であることに着目すると識別子であるとも言える。 文字列が名前であるか識別子であるかは文脈や環境に依存するのである。 では文脈や環境とは何か。これもまた定義することが難しい。
#誤認しにくい文字列
引用符やエスケープの必要な特殊文字や空白を含む文字列は、その曖昧さから伝達に際して誤認される可能性がある。 例えば全角スペースと半角スペースを識別することは難しく、文字列の前後についている空白も正しく伝達されない。 そこで次のように正規化する。
- 文字列の前後の空白記号は無視する
- 連続する空白記号はまとめて一つのハイフン「-」に置き換える
- 引用符やエスケープの必要な特殊な文字は全てハイフン「-」に置き換える
- 何が特殊な文字かについては別途定める
Gmailのラベルではスラッシュ「」や二重引用符「」が特殊な文字として置き換えの対象になっている。
- 一重引用符とスペースを交互に並べ最後に空白を付け加えた「' ' ' ' 」は「'-'-'-'」として取り扱われる
- 二重引用符とスペースを交互に並べ最後に空白を付け加えた「" " " " " 」は「-------」として取り扱われる
- 「0/0//」は「0-0--」として取り扱われる
- 「/ //」は「----」として取り扱われる
Google Apps Scriptの動作から推測すると、 Gmailのラベルでは内部的にラベル識別子のような番号が付与されているわけではないようである。 つまり変換後の文字列がラベルを一意に表す識別子そのものとして扱われているようである。 しかしgetUserLabelsなどで取得されたUserLabelオブジェクトからgetNameで取得できる文字列は あくまで変換前の文字列であり、Gmailの表示においても変換前の文字列が使われる。 つまりユーザーが目にするのは変換前の文字列である。