[2] 文字列を識別子とする場合、識別子を構成可能な文字の集合が問題となります。
[3] 旧来計算機処理において識別子は ASCII文字の一部のみ等、 極めて限定的な文字しか使えないことが非常によくありました。
[4] 関連: 非英語プログラミング言語, 国際化, 欧米中心主義, 名前文字, ENR
[6] WG20 - Standards http://www.open-std.org/JTC1/SC22/WG20/docs/standards#10176
ISO/IEC TR 10176 追補1 : プログラム言語の識別子の多文字化に関する推奨
[1] XML 1.0 (第4版以前) や IDNA2003 / Stringprep は Unicodeの版を固定し、その時点で存在していた文字から識別子に使える文字を決めていました。
[5] XML 1.1 や XML 1.0 (第5版以降) や IDNA2008 や PRECIS は Unicode の文字特性を基に利用可能な条件を定めていて、 新しいUnicodeの版に自動追随可能としました。
[11] 多くの場合、記号は識別子文字に含まれません。しかし何を識別子で使えない記号と見なすかには色々な考え方があります。
[12] 記号が識別子で使えないのは、 記号に区切子や演算子など特殊な役割を当てはめるためというのが主な理由です。
[13] 機能を持っている記号を識別子で使えないのは当然として、 現時点で機能を持っていない記号もできるだけ排除して将来の拡張に備えるのがいいという考え方と、 識別子の表現力や処理の簡潔性のため不要な制限はできるだけ排除すべく特別な意味を持たない記号は識別子文字に含める考え方があります。
[14] 識別子に使うべきでない記号の決定は、かなり難しい問題です。 ある文化圏での常識が他の文化圏でも常識とは限りません。
[15]
日本語ではしばしば長音表記に使われる〜
が排除されて実害が生じています。
[7] まゆまゆさんはTwitterを使っています 「多くの人工言語は ASCII のなかに文字を収めようとして ⟨q⟩ に曖昧母音を振ると聞きますけど,X-SAMPA や白氏拼音は ⟨@⟩ や ⟨+⟩ を中母音に使っているんですよ?」 / Twitter (午後9:04 · 2021年5月16日 , ) https://twitter.com/nekw0/status/1393900176620679173
[8] 真空さんはTwitterを使っています 「Unicode で文字または数字とされているもののみを使わないと,(正書法に必要な制御文字さえも) インターネット上のサーヴィスのお節介入力フィルタに弾かれてものの名前等に設定できないという例があります.(西洋文化圏のエンジニアは記号や制御文字がまさか使う必要があると思わない)」 / Twitter (午後9:19 · 2021年5月16日 , ) https://twitter.com/masora_m/status/1393903980745428992
[53] 応用によって事情も異なるとはいえ、実害の方が多く識別子では使うべきではない符号位置はいくらかあります。
U-110000
以上の符号位置や文字でないバイト)
は、相互運用性のために禁止するべきです。Cs
) は相互運用性とセキュリティーのために禁止するべきです。Cc
) は相互運用性とセキュリティーのために禁止するべきです。[58] Unicodeの版によって適切な処理が変化することに注意が必要です。
[63] 状況によって判断が求められるものもあります。
White_Space
は構文上周囲と空白によって区別されるべき識別子では禁止するべきです。
それ以外の場合でも、 U+0020
のみを認める、
U+0020
に正規化する、
連続を認めないなど、
実用上の配慮が必要です。ZWJ
や ZWNJ
が、それがなければ表現できないものもありますが、
あってもなくても良い(があった方が見た目がいいなど)程度でも使われることもありますし、
悪用されることもあり、そうでなくても混乱の元で、
慎重な対処が必要です。Prepended_Concatenation_Mark
は有害性がなく、言語によっては必要なので、認めるべきです。CGJ
は混乱の元になる可能性があり、場合によっては規制するべきです。[89]
ASCII文字のうち -
は区切りに使うので先頭や末尾に持ってこれないようにしたい、
のような規則を非ASCII文字にも拡張したいと思うかもしれません。
しかし文字の使われ方は多様で、あらゆる言語、
表記法を考慮して適切な規則を設定するのは困難です。
強い動機がない限り、無闇に制約を付けるべきではありません。
[54]
IDNA2008 は IgnorableProperties
,
PRECIS は PrecisIgnorableProperties
を定めていて、
識別子に不適切な符号位置と説明しています。
しかし他の応用では必ずしも不適切ではない (むしろ適切な表現のためには認めるべき)
符号位置も含まれています。
[10] 関連: 文字のセキュリティー
[77] Unicode正規化すればいいと思ってしまいますが、安易に適用するのは危険です。 >>45
[80] また、違う意味ながら字形が似ている事例は膨大にありますが、 それらはUnicode正規化ではまったく解決しません。
[25] XユーザーのLove Live! School idol festival 2 MIRACLE LIVE!さん: 「【SIF→SIF2 Memory Album transfer Notice】 We've noticed that many of you having trouble with [SIF1→SIF2 Memory Album transfer] are experiencing issues due to incorrect input of '0' (zero) and 'o' (/oʊ/). If you're encountering this difficulty, please double-check before… https://t.co/U4SoupQ0N4」 / X, , https://twitter.com/lovelive_SIF_GL/status/1755117951295144319
[26] まともな技術者 (設計者) なら人間に発行するIDには絶対やらないんだけどな。。。 過去に何かしら (まともじゃないシステムに遭遇して) 痛い目をみているから。。。
[19] 多くの識別子仕様は、識別子の先頭文字にそれ以外の文字よりも厳しい制限を与えています。
[20]
例えば多くの場合識別子の先頭に数字は認められません。
また、
-
が認められないことも多いです。
これは構文上識別子と数値を両立させる必要性に起因しています。
[24] 特定の文字の連続が規制されることもたまにあります。
[27] インターネットメールアドレスのlocal-partでは.
を連続させられません。
[51] IDNA2008 / PRECIS はいくつかの文字に文脈的規則を定めています。 複雑な規則ですが、簡単に言えば特定の文字の並びでのみ特定の記号を認めています。
[83] bidi アルゴリズムとの関係にも注意が必要です。
[84] bidi の制御のための文字は悪用されることもあり、 そうでなくても誤用時の混乱は必至で、注意が必要です。 >>71
[85] 制御用の文字が皆無でも、左横書き文字と右横書き文字の混在や識別子の前後に置かれる文字との関係で、 表示が混乱することがあります。
[86] IDNA2008 / PRECIS はbidi規則を定めています。簡単に言えば左横書きと右横書きの混在を禁止しています。
[45] 識別子はUnicode正規化が適用されることがしばしばありますが、 危険です。
[46] Unicode正規化は破壊的な操作です。言語によっては似た文字に置き換えられて適正な表示ができなくなります。
[50] 従ってUnicode正規化を識別子仕様に持ち込まないのが賢明です。
[78] Unicode正規化の一部を修正したHFS+のNFDなら、意味が変わってしまう変更はほぼ避けられます。
[79] しかし同じ意味のUnicode符号位置の列でもUnicode正規化で一意にならない事例は多々あります。
[47] 識別子の大文字と小文字の区別はされることも、されないこともあります。 古くからある技術ほど、ASCII大文字・小文字不区別な傾向があります。
[48] 大文字と小文字の関係性は自然言語によっても違いがあり複雑です。 ある文化圏の人にとって自然でも他の文化圏の人にとって不自然な同一視がされてしまう (見かけ上違う識別子が一致したり、書き換わったりする) ことがあります。
[49] よって大文字と小文字の関係を識別子仕様に持ち込まないのが賢明です。
[28] プログラミング言語等の識別子は空文字列を認めないのが普通です。
[29] プロトコル要素などとして使われる識別子で空文字列が認められることもたまにあります。
[30] 識別子には長さの上限が決められていることが多いです。
[31] 古い時代の技術ほど制限が厳しいことが多いです。
[32] 制限が厳しいと自由な命名が厳しくなります。 特定の文化圏の常識によって厳しい制限を加えると困る人が出てくることがあります。
[39] 特定の値に完全一致する、または特定の条件に一致する識別子が、 特別な意味を持つことがしばしばあります。
[40] 関連: 特殊ドメイン名, 特殊ファイル名, ファイル配置
[41] 一般公開されたWebサービスでは、サービス名や運営事業者名などを含む識別子が運営事業者によって予約されていることが多いです。
[66] 識別子を使う文脈によって、エスケープを使って記述できることもあれば、 できないこともあります。
[67] エスケープが使えることを前提に、構文要素としての識別子よりもプロトコル要素としての識別子がより自由度が高い場合があります。
[34] ほとんどすべての場合、識別子には言語情報を含められません。
しかし言語情報のないUnicode文字列は正しくレンダリングできません。
[35] 従って識別子はそれが含まれる文書の言語情報や利用者の閲覧環境など、 外部的な条件に依存してレンダリングされることに注意が必要です。
[17] 特定の技術において識別子の文字の取り扱いを定めたもの:
[23] その他特に注意されるもの: