識別子文字

識別子文字

[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 / StringprepUnicodeの版を固定し、その時点で存在していた文字から識別子に使える文字を決めていました。

[5] XML 1.1XML 1.0 (第5版以降) や IDNA2008PRECISUnicode文字特性を基に利用可能な条件を定めていて、 新しいUnicodeの版に自動追随可能としました。

[9] 関連: XMLにおける文字, IDNA2008, PRECIS, 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

識別子安全性

[43] 識別子に使える文字のみによって構成されることを「安全」ということがあります。

[44] 関連: サニタイズ, URL安全

識別子で禁止するべき特殊文字

[53] 応用によって事情も異なるとはいえ、実害の方が多く識別子では使うべきではない符号位置はいくらかあります。

[58] Unicodeの版によって適切な処理が変化することに注意が必要です。

  • >>3
  • [59] 未割当符号位置を禁止するか、認めるかは慎重な判断が求められます。
  • [64] それ以外も分類の変化があり得ることに注意が必要です。

[63] 状況によって判断が求められるものもあります。

  • [62] White_Space は構文上周囲と空白によって区別されるべき識別子では禁止するべきです。 それ以外の場合でも、 U+0020 のみを認める、 U+0020正規化する、 連続を認めないなど、 実用上の配慮が必要です。
  • [70] 書式文字は基本的に禁止するべきです。
    • [71] bidi に関する制御のための文字は、それがなければ表現できないものもありますが、 フィッシング目的で悪用されることもあり ( 文字のセキュリティー )、 そうでなくても混乱の元で、慎重な対処が必要です。

      [73] 見かけ上の文字の表示の順序を反転させて利用者の判断を誤らせることがあります。

    • [72] ZWJZWNJ が、それがなければ表現できないものもありますが、 あってもなくても良い(があった方が見た目がいいなど)程度でも使われることもありますし、 悪用されることもあり、そうでなくても混乱の元で、 慎重な対処が必要です。

      [74] IDNA では CONTEXTJ で制限が加えられています。

    • [94] Prepended_Concatenation_Mark は有害性がなく、言語によっては必要なので、認めるべきです。
  • [75] CGJ は混乱の元になる可能性があり、場合によっては規制するべきです。
  • [76] 利用方法によっては、似た形の文字への配慮が必要です。 >>10
  • [82] 利用方法によってはbidi規則が必要です。 >>83

[89] ASCII文字のうち - は区切りに使うので先頭や末尾に持ってこれないようにしたい、 のような規則を非ASCII文字にも拡張したいと思うかもしれません。 しかし文字の使われ方は多様で、あらゆる言語、 表記法を考慮して適切な規則を設定するのは困難です。 強い動機がない限り、無闇に制約を付けるべきではありません。

[54] IDNA2008IgnorableProperties, PRECISPrecisIgnorableProperties を定めていて、 識別子に不適切な符号位置と説明しています。 しかし他の応用では必ずしも不適切ではない (むしろ適切な表現のためには認めるべき) 符号位置も含まれています。

[69] 例えば異体選択子が含まれますが、適切な表示のために必要な言語があります。

[88] >>87 禁止したほうがいいUnicode文字のリスト

似た字形の文字

[10] 関連: 文字のセキュリティー

[77] Unicode正規化すればいいと思ってしまいますが、安易に適用するのは危険です。 >>45

[80] また、違う意味ながら字形が似ている事例は膨大にありますが、 それらはUnicode正規化ではまったく解決しません。

[81] 例えば1IlAΑは似ています。

人間に入力させる識別子

[42] 関連: Base58

[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] 例えば多くの場合識別子の先頭に数字は認められません。 また、 - が認められないことも多いです。 これは構文上識別子数値を両立させる必要性に起因しています。

[21] 末尾の文字に制限が加わる場合もあります。

[22] LDHラベルの末尾に - は使えません。

[24] 特定の文字の連続が規制されることもたまにあります。

[27] インターネットメールアドレスlocal-partでは.を連続させられません。

[51] IDNA2008 / PRECIS はいくつかの文字文脈的規則を定めています。 複雑な規則ですが、簡単に言えば特定の文字の並びでのみ特定の記号を認めています。


[90] 識別子が内なる構造を持つ時は、その構造も考慮が必要です。

[91] ファイル名拡張子とその前の部分で構成されることが多いです。 拡張子はそれだけを取り出して使うことがあります。 全体としてだけでなく拡張子単独のときにも困らないように検査が必要になります。

[92] ドメイン名 (IDN) は複数の名札. で連結して構成されます。 IDN では正規化によって.を生成することに注意した処理を必要とします。

書字方向の規則

[83] bidi アルゴリズムとの関係にも注意が必要です。

[84] bidi の制御のための文字は悪用されることもあり、 そうでなくても誤用時の混乱は必至で、注意が必要です。 >>71

[85] 制御用の文字が皆無でも、左横書き文字と右横書き文字の混在や識別子の前後に置かれる文字との関係で、 表示が混乱することがあります。

[86] IDNA2008 / PRECISbidi規則を定めています。簡単に言えば左横書き右横書きの混在を禁止しています。

正規化

[45] 識別子Unicode正規化が適用されることがしばしばありますが、 危険です。

[46] Unicode正規化は破壊的な操作です。言語によっては似た文字に置き換えられて適正な表示ができなくなります。 Unicode正規化

[50] 従ってUnicode正規化識別子仕様に持ち込まないのが賢明です。

[78] Unicode正規化の一部を修正したHFS+のNFDなら、意味が変わってしまう変更はほぼ避けられます。

[79] しかし同じ意味のUnicode符号位置の列でもUnicode正規化で一意にならない事例は多々あります。


[47] 識別子大文字と小文字の区別はされることも、されないこともあります。 古くからある技術ほど、ASCII大文字・小文字不区別な傾向があります。

[48] 大文字と小文字の関係性は自然言語によっても違いがあり複雑です。 ある文化圏の人にとって自然でも他の文化圏の人にとって不自然な同一視がされてしまう (見かけ上違う識別子が一致したり、書き換わったりする) ことがあります。

[49] よって大文字と小文字の関係を識別子仕様に持ち込まないのが賢明です。


[52] PRECIS幅写像規則として半角文字全角文字正規化を定めています。

長さ

[28] プログラミング言語等の識別子空文字列を認めないのが普通です。

[29] プロトコル要素などとして使われる識別子空文字列が認められることもたまにあります。


[30] 識別子には長さの上限が決められていることが多いです。

[31] 古い時代の技術ほど制限が厳しいことが多いです。

[32] 制限が厳しいと自由な命名が厳しくなります。 特定の文化圏の常識によって厳しい制限を加えると困る人が出てくることがあります。

[33] 言語によって単語を表すために必要な平均的な文字数は違います。 文字の種類によっては基底文字結合文字のようないくつかの Unicode文字の組み合わせでようやく一般的に認知される「文字」 が記述できる場合もあります。

予約名

[39] 特定の値に完全一致する、または特定の条件に一致する識別子が、 特別な意味を持つことがしばしばあります。

[40] 関連: 特殊ドメイン名, 特殊ファイル名, ファイル配置

[41] 一般公開されたWebサービスでは、サービス名や運営事業者名などを含む識別子が運営事業者によって予約されていることが多いです。

エスケープ

[66] 識別子を使う文脈によって、エスケープを使って記述できることもあれば、 できないこともあります。

[67] エスケープが使えることを前提に、構文要素としての識別子よりもプロトコル要素としての識別子がより自由度が高い場合があります。

[68] 一口に識別子といってもいろいろなものがあるので注意が必要です。

レンダリング

[34] ほとんどすべての場合、識別子には言語情報を含められません。 しかし言語情報のないUnicode文字列は正しくレンダリングできません。 言語情報, 文字のレンダリング

[35] 従って識別子はそれが含まれる文書言語情報利用者の閲覧環境など、 外部的な条件に依存してレンダリングされることに注意が必要です。

[37] 例えばプログラミング言語ソースコード日本語識別子中文識別子が混在していると、 両方を正しく表示することができません。 閲覧者の言語設定次第で表示方法が決まります。

[36] 応用の設計時には適切に言語情報が設定されるように注意が必要です。

[38] 例えばWebサービス利用者名前漢字を使える場合、 日本語利用者中文利用者を区別しておかないと、 両者が出現するメンバーリストのようなものを正しく表示できません。

応用

[16] 識別子文字の取り扱いを一般化して定めたもの:

[17] 特定の技術において識別子文字の取り扱いを定めたもの:

[18] 識別子文字集合の記述:

[23] その他特に注意されるもの:

メモ