正書法やタイポグラフィにおいて、ホモグリフ(英語: homoglyph)とは、同一または非常によく似た形をした2つ以上の書記素、文字、字体(グリフ)のことである。この呼称は、このような特性を持つ複数の文字の列についても適用される。
シノグリフ(英語: Synoglyphs)とは、見た目は違うが同じ意味を持つ字体のことである。シノグリフは、非公式には「表示変化形」(display variants)ともいう。
「ホモグラフ」(homograph)という用語がホモグリフの同義語として使われることもある(ホモグラフ攻撃など)が、通常の言語学的な意味では、ホモグラフとは、綴りは同じだが意味が異なる単語のことであり、文字ではなく単語の性質である。日本語では同綴異義語という。
2008年、Unicodeコンソーシアムは、単一の用字内の文字の視覚的な類似性や、異なる用字内の文字間の類似性に由来する様々な問題について、技術報告書#36[1]を発表した。
歴史的な観点から見たホモグリフの混乱の例としては、"þ"(ソーン)の文字を含まない書体で古い英文を表記する際に、"þ"を表すために"y"(ワイ)を使用したことが挙げられる。これは現代では、"Ye olde shoppe"のような古い英文により、「"the"という単語が以前は"ye" [jiː]と書かれていた」と誤って暗示してしまう現象につながっている。詳細については、Þを参照のこと。
ホモグリフ記号の例としては、(a) トレマとウムラウト(両方とも一対のドットで、意味は異なるが、同じコードポイントでコード化されている)、(b) ハイフンとマイナス記号 (両方とも短い横向きの線で、意味は異なるが、しばしば同じコードポイントでコード化されている)などが挙げられる。数字と文字の間では、数字の1(いち)と小文字のl(エル)、数字0(ゼロ)と大文字のO(オー)は、それぞれ常に別のコードポイントでコード化されているが、多くのフォントでは非常に類似した字体が与えられている。事実上、文字の全てのホモグリフ対は、明確に区別可能な字体と別々のコードポイントにより表示上で区別できる可能性があるが、必ずしもそうなっているとは限らない。1(いち)とl(エル)、0(ゼロ)とO(オー)のホモグリフを強調的に区別しない書体は、数式やURL、ソースコード、IDなど、文脈から判断しなければどちらの文字か判別できないようなテキストを書くのには適していないと考えられている。そのような用途には、例えば斜線付きゼロによって字体を区別するフォントが好ましい。
また、例えば6bを66だと誤認するなど、0とoや6とb、9とqなどはしばしば数学教育の場面において手書きが使用されるために間違えられることがあり、対策として学生らの間では文字を筆記体で書いたり、一段上げたり下げたり、時には大文字を使うなどが行われている。
機械式タイプライターの時代には、ウムラウトとトレマは同じキーでタイプされていたが、二重反転カンマにも使用されていた。しかし、ウムラウトは、元々は2つの短い縦線(点ではなく)として生まれたものである(ジュッターリーン体を参照)。ちなみに、アルバニア語のEの上にある2つの点はトレマとして記述されているが、トレマの機能を果たしていない。
今日使用されている2組の一般的で重要なホモグリフは、数字の0(ゼロ)・大文字のO(オー)、および、数字の1(いち)・小文字のl(エル)・大文字のI(アイ)である。初期の機械式タイプライターの時代には、これらの字体の間にはほとんど、あるいは全く視覚的な違いがなく、タイピストはキーボードショートカットとしてそれらを互換的に扱っていた。実際、ほとんどのキーボードには数字の1のためのキー自体がなく、ユーザーはその代わりに小文字のl(エル)を入力していた。また、いくつかの機種では数字の0のキーもなく、O(オー)で代用していた。1970年代にタイピストだった人たちが、1980年代にコンピュータのキーボードオペレータに移行したため、タイプライターでの習慣がそのままコンピュータにも持ち込まれ、これが混乱の原因となっていた。
体積の単位のリットルの記号は、単位名称が人名由来ではないため本来は小文字の l (エル)となるが、数字の 1 と似ていて紛らわしいことから大文字の L とすることが推奨されている。
現在のほとんどの書体デザインでは、これらのホモグリフを慎重に区別しており、通常は数字のゼロを文字のオーよりも幅を狭くし、数字の1には上部に(フォントによっては下部にも)セリフをつけている。初期のコンピュータのプリントアウトでは、数字のゼロに斜線やドットをつけて明確に区別していた(斜線付きゼロを参照)。しかしこれは、北ゲルマン語群の文字"Ø"やギリシャ文字のΦ(ファイ)との新たなホモグリフを生んだ。これらの、文字を区別するための字体の再設計は混乱を少なくする。2つの異なる文字が同じように見える程度の度合いを、「視覚的類似性」(visual similarity)という[2]。
日本語においては、漢字・片仮名間および各文字種内に複数のホモグリフが存在する。例えば、JPRSがホモグラフ攻撃に関連して提出した意見書においては、以下のものが挙げられている[3]。
複数の文字の組み合わせが別の文字と似た形になるものがいくつかある。例えばrnとm、clとd、vvとwなどである。一部の狭間隔フォント(Tahomaなど)では、j・l・iなどの文字の隣にcを配置すると、cj cl ci(g d a) のようなホモグリフができてしまう。いくつかの文字が隣り合って配置されていると、一目見ただけでは関係のない別の文字であるかのような視覚的な印象を与えることができる。これをより正確に言うと、合字の中には別の文字の字体と似たように見えるものがある。例えば、fiの合字(fi)は、いくつかの書体やフォントではAのように見えることがある。このような混同の可能性は、合字の使用に反対する論拠になることがある。
Unicodeの文字セットには、多くのホモグリフが含まれている。これらは、様々な状況においてセキュリティ上のリスクをもたらすが、最近では国際化ドメイン名(IDN)に関して特に注意が払われている。ある文字をそのホモグリフに置き換えることでドメイン名を意図的に詐称し、本来のドメイン名と容易に区別できない別のドメイン名を作成して、フィッシングに悪用される可能性がある(ホモグラフ攻撃を参照)。多くのフォントでは、ギリシャ文字の"Α"・キリル文字の"А"・ラテン文字の"A"、および、ラテン文字の"a"・キリル文字の"а"は視覚的に同じである(ラテン文字の"aBeHKopcTxy"とキリル文字の"аВеНКТорсху"にも同じことが言える)。ドメイン名は、別に登録された名前の中で、これらの文字のいずれかを別の文字に置き換えるだけで、なりすましが可能である。また、"i"と"í"(アキュートアクセントつき)、"É"(アキュート)と"Ė"(ドット)と"È"(グラーブ)、"Í"(アキュートつきの大文字のアイ)と"ĺ"(アキュートつきの小文字のエル)など、同じ用字の中でもホモグリフが多数存在する。このセキュリティ上の問題を議論する際には、類似した文字が2つ並んでいても、「ホモグリフのペア」(homoglyph pair)とみなされる可能性があるか、あるいは明らかに単語であるように見える場合には「擬似ホモグラフ」(pseudo-homograph)とみなされる可能性があるという観点から評価することができる(この用語自体が他の文脈で混乱を招く可能性があることに注意)。中国語では、多くの簡体字は対応する繁体字のホモグリフである。
ホモグリフの混同のリスクを最小限に抑えるために、ドメイン名のレジストリやウェブブラウザの設計における努力が行われている。一般的に、これは複数の言語の文字セットを混ぜた名前を禁止することで達成されている(これにより、キリル文字のЯを使った"toys-Я-us.org"は無効になっているが、"wikipedia.org"とは別の"wíkipedia.org"(2文字目のアイがアキュートつき。ポルトガル語版アンサイクロペディアに転送される)は、同じ用字であることから無効になっていない)。カナダの.caのレジストリはさらに一歩進んだ形で、ダイアクリティカルマークが異なるだけのドメイン名は、同じ所有者が同じレジストラに登録することが義務づけられている[4]。漢字における簡体字と繁体字の扱いは様々である。.orgと.infoでは、片方を登録するともう片方は誰も利用できなくなるが、.bizでは簡体字と繁体字の2種類のドメインがドメインバンドルとして扱われ、両方とも同じDNSサーバを指すようになっている。
関連するドキュメントは、開発者のウェブサイトやICANNが提供するIDNフォーラム[5]に掲載されている。
あらゆる種類のホモグリフは、「二重カノン化」(dual canonicalization)と呼ばれるプロセスによって検出することができる[2]。このプロセスの最初のステップは、ホモグリフの集合、すなわち、同じように見える文字を識別することである。ここから、ホモグリフの集合を表現するための単一のトークンが指定される。このトークンをカノン(canon)と呼ぶ。次のステップでは、カノン化と呼ばれるプロセスで、テキストの各文字を対応するカノンに変換する。2つのテキストのカノンが同じでも、元のテキストが異なる場合、テキストにはホモグリフが存在する。