Funnychar

動機

Unicodeは字形を区別して登録しない
つまり a は a であり、 a としても a としても、全て同じ U+0041 として文字セットに登録されている
でも、あれ?インターネット上では似たような文字よく見るよね。。どうなっているんだろう。。

似たような文字の整理

そこで、似たような字形のものを整理してみた
めっちゃ字形を区別して登録してますけどwww🤔🤔🤔

CodePoint Name Detail glyph(字形)
U+0041 - U+005A LATIN CAPITAL LETTER ASCIIコード ABCDEFGHIJKLMNOPQRSTUVWXYZ
U+0061 - U+007A LATIN SMALL LETTER ASCIIコード abcdefghijklmnopqrstuvwxyz
U+249C - U+24B5 PARENTHESIZED LATIN SMALL LETTER 括弧付きラテン文字 ⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵
U+24B6 - U+24CF CIRCLED LATIN CAPITAL LETTER 丸付きラテン文字 ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏ
U+24D0 - U+24E9 CIRCLED LATIN CAPITAL SMALL 丸付きラテン文字 ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ
U+FF21 - U+FF3A FULLWIDTH LATIN CAPITAL 全角文字 ABCDEFGHIJKLMNOPQRSTUVWXYZ
U+FF41 - U+FF5A FULLWIDTH LATIN SMALL 全角文字 abcdefghijklmnopqrstuvwxyz
U+1D400 - U+1D419 MATHEMATICAL BOLD CAPITAL 数学用 𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙
U+1D41A - U+1D433 MATHEMATICAL BOLD SMALL 数学用 𝐚𝐛𝐜𝐝𝐞𝐟𝐠𝐡𝐢𝐣𝐤𝐥𝐦𝐧𝐨𝐩𝐪𝐫𝐬𝐭𝐮𝐯𝐰𝐱𝐲𝐳
U+1D434 - U+1D44D MATHEMATICAL ITALIC CAPITA 数学用 𝐴𝐵𝐶𝐷𝐸𝐹𝐺𝐻𝐼𝐽𝐾𝐿𝑀𝑁𝑂𝑃𝑄𝑅𝑆𝑇𝑈𝑉𝑊𝑋𝑌𝑍
U+1D44E - U+1D467 MATHEMATICAL ITALIC SMALL 数学用 𝑎𝑏𝑐𝑑𝑒𝑓𝑔𝑕𝑖𝑗𝑘𝑙𝑚𝑛𝑜𝑝𝑞𝑟𝑠𝑡𝑢𝑣𝑤𝑥𝑦𝑧
U+1D468 - U+1D481 MATHEMATICAL BOLD ITALIC CAPITAL 数学用 𝑨𝑩𝑪𝑫𝑬𝑭𝑮𝑯𝑰𝑱𝑲𝑳𝑴𝑵𝑶𝑷𝑸𝑹𝑺𝑻𝑼𝑽𝑾𝑿𝒀𝒁
U+1D482 - U+1D49B MATHEMATICAL BOLD ITALIC SMALL 数学用 𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛
U+1D49C - U+1D4B5 MATHEMATICAL SCRIPT CAPITAL 数学用 𝒜𝒝𝒞𝒟𝒠𝒡𝒢𝒣𝒤𝒥𝒦𝒧𝒨𝒩𝒪𝒫𝒬𝒭𝒮𝒯𝒰𝒱𝒲𝒳𝒴𝒵
U+1D4B6 - U+1D4CF MATHEMATICAL SCRIPT SMALL 数学用 𝒶𝒷𝒸𝒹𝒺𝒻𝒼𝒽𝒾𝒿𝓀𝓁𝓂𝓃𝓄𝓅𝓆𝓇𝓈𝓉𝓊𝓋𝓌𝓍𝓎𝓏
U+1D4D0 - U+1D4E9 MATHEMATICAL BOLD SCRIPT CAPITAL 数学用 𝓐𝓑𝓒𝓓𝓔𝓕𝓖𝓗𝓘𝓙𝓚𝓛𝓜𝓝𝓞𝓟𝓠𝓡𝓢𝓣𝓤𝓥𝓦𝓧𝓨𝓩
U+1D4EA - U+1D503 MATHEMATICAL BOLD SCRIPT SMALL 数学用 𝓪𝓫𝓬𝓭𝓮𝓯𝓰𝓱𝓲𝓳𝓴𝓵𝓶𝓷𝓸𝓹𝓺𝓻𝓼𝓽𝓾𝓿𝓿𝔀𝔁𝔂𝔃
U+1D504 - U+1D51D MATHEMATICAL FRAKTUR CAPITAL 数学用 𝔄𝔅𝔆𝔇𝔈𝔉𝔊𝔋𝔌𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔕𝔖𝔗𝔘𝔙𝔚𝔛𝔜𝔝
U+1D51E - U+1D537 MATHEMATICAL FRAKTUR SMALL 数学用 𝔞𝔟𝔠𝔡𝔢𝔣𝔤𝔥𝔦𝔧𝔨𝔩𝔪𝔫𝔬𝔭𝔮𝔯𝔰𝔱𝔲𝔳𝔴𝔵𝔶𝔷
U+1D538 - U+1D551 MATHEMATICAL DOUBLE-STRUCK CAPITAL 数学用 𝔸𝔹𝔺𝔻𝔼𝔽𝔾𝔿𝕀𝕁𝕂𝕃𝕄𝕅𝕆𝕇𝕈𝕉𝕊𝕋𝕌𝕍𝕎𝕏𝕐𝕑
U+1D552 - U+1D56B MATHEMATICAL DOUBLE-STRUCK SMALL 数学用 𝕒𝕓𝕔𝕕𝕖𝕗𝕘𝕙𝕚𝕛𝕜𝕝𝕞𝕟𝕠𝕡𝕢𝕣𝕤𝕥𝕦𝕧𝕨𝕩𝕪𝕫
U+1D56C - U+1D585 MATHEMATICAL BOLD FRAKTUR CAPITAL 数学用 𝕬𝕭𝕮𝕯𝕰𝕱𝕲𝕳𝕴𝕵𝕶𝕷𝕸𝕹𝕺𝕻𝕼𝕽𝕾𝕿𝖀𝖁𝖂𝖃𝖄𝖅
U+1D586 - U+1D59F MATHEMATICAL BOLD FRAKTUR SMALL 数学用 𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟
U+1D5A0 - U+1D5B9 MATHEMATICAL SANS-SERIF CAPITAL 数学用 𝖠𝖡𝖢𝖣𝖤𝖥𝖦𝖧𝖨𝖩𝖪𝖫𝖬𝖭𝖮𝖯𝖰𝖱𝖲𝖳𝖴𝖵𝖶𝖷𝖸𝖹
U+1D5BA - U+1D5D3 MATHEMATICAL SANS-SERIF SMALL 数学用 𝖺𝖻𝖼𝖽𝖾𝖿𝗀𝗁𝗂𝗃𝗄𝗅𝗆𝗇𝗈𝗉𝗊𝗋𝗌𝗍𝗎𝗏𝗐𝗑𝗒𝗓
U+1D5D4 - U+1D5ED MATHEMATICAL SANS-SERIF BOLD CAPITAL 数学用 𝗔𝗕𝗖𝗗𝗘𝗙𝗚𝗛𝗜𝗝𝗞𝗟𝗠𝗡𝗢𝗣𝗤𝗥𝗦𝗧𝗨𝗩𝗪𝗫𝗬𝗭
U+1D5EE - U+1D607 MATHEMATICAL SANS-SERIF BOLD SMALL 数学用 𝗮𝗯𝗰𝗱𝗲𝗳𝗴𝗵𝗶𝗷𝗸𝗹𝗺𝗻𝗼𝗽𝗾𝗿𝘀𝘁𝘂𝘃𝘄𝘅𝘆𝘇
U+1D608 - U+1D621 MATHEMATICAL SANS-SERIF ITALIC CAPITAL 数学用 𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡
U+1D622 - U+1D63B MATHEMATICAL SANS-SERIF ITALIC SMALL 数学用 𝘢𝘣𝘤𝘥𝘦𝘧𝘨𝘩𝘪𝘫𝘬𝘭𝘮𝘯𝘰𝘱𝘲𝘳𝘴𝘵𝘶𝘷𝘸𝘹𝘺𝘻
U+1D63C - U+1D655 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL 数学用 𝘼𝘽𝘾𝘿𝙀𝙁𝙂𝙃𝙄𝙅𝙆𝙇𝙈𝙉𝙊𝙋𝙌𝙍𝙎𝙏𝙐𝙑𝙒𝙓𝙔𝙕
U+1D656 - U+1D66F MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL 数学用 𝙖𝙗𝙘𝙙𝙚𝙛𝙜𝙝𝙞𝙟𝙠𝙡𝙢𝙣𝙤𝙥𝙦𝙧𝙨𝙩𝙪𝙫𝙬𝙭𝙮𝙯
U+1D670 - U+1D689 MATHEMATICAL MONOSPACE CAPITAL 数学用 𝙰𝙱𝙲𝙳𝙴𝙵𝙶𝙷𝙸𝙹𝙺𝙻𝙼𝙽𝙾𝙿𝚀𝚁𝚂𝚃𝚄𝚅𝚆𝚇𝚈𝚉
U+1D68A - U+1D6A3 MATHEMATICAL MONOSPACE SMALL 数学用 𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚢𝚣
U+1F110 - U+1F129 PARENTHESIZED LATIN CAPITAL LETTER 括弧付きラテン文字 🄐🄑🄒🄓🄔🄕🄖🄗🄘🄙🄚🄛🄜🄝🄞🄟🄠🄡🄢🄣🄤🄥🄦🄧🄨🄩
U+1F130 - U+1F149 SQUARED LATIN CAPITAL LETTER 四角付きラテン文字 🄰🄱🄲🄳🄴🄵🄶🄷🄸🄹🄺🄻🄼🄽🄾🄿🅀🅁🅂🅃🅄🅅🅆🅇🅈🅉
U+1F150 - U+1F169 NEGATIVE CIRCLED LATIN CAPITAL LETTER 白抜き黒丸付きラテン文字 🅐🅑🅒🅓🅔🅕🅖🅗🅘🅙🅚🅛🅜🅝🅞🅟🅠🅡🅢🅣🅤🅥🅦🅧🅨🅩
U+1F170 - U+1F189 NEGATIVE SQUARED LATIN CAPITAL LETTER 白抜き黒四角付きラテン文字 🅰🅱🅲🅳🅴🅵🅶🅷🅸🅹🅺🅻🅼🅽🅾🅿🆀🆁🆂🆃🆄🆅🆆🆇🆈🆉
U+1F1E6 - U+1F1FF REGIONAL INDICATOR SYMBOL LETTER 地域指示記号 🇦🇧🇨🇩🇪🇫🇬🇭🇮🇯🇰🇱🇲🇳🇴🇵🇶🇷🇸🇹🇺🇻🇼🇽🇾🇿

似たような文字だけど区別された理由

こんな理由で区別されているようです*2

Block Name CodePoint Detail
数学用英数字記号 Mathematical Alphanumeric Symbols U+1D400~U+1D7FF 英数字を様々な書体で表した形式の記号です。数学や技術的な表記以外での使用は禁じられています。
囲み英数字 Enclosed Alphanumerics U+2460~U+24FF リスト上の順序を表わすために用いられる英数字です。ほとんどは東アジアの既存の規格との互換用です。
囲み英数字補助 Enclosed Alphanumeric Supplement U+1F100~U+1F1FF 日本のデータ放送規格ARIB STD B24や携帯電話の絵文字との互換用の英数字、地域コードを表現するためのラテン文字などです。

The Unicode Consortium の努力

ユニコードコンソーシアムはがんばって以下の定義で区別しようとしたようです
Unicodeは、文字(character),グリフ(glyph),フォント(font)の定義があり、文字毎にコードポイントに登録している*1

単語 意味
文字 言語において意味をもつ最小単位。特定の形状のことを指すものではなく、抽象的な意味と抽象的な形状のことを指す
グリフ 文字が描画あるいは表示されるときに持ちうる形状を表現するもの
フォント 文字の視覚的表現のために使われるグリフを集めたもの

ふんふん、そうだよね。だからグリフによらずaはa(U+0041)なんだよね
でも、どうやら

文字とグリフの間に明確な境界があるわけではない

ということらしい。例えば*1

  • ナンバーサイン(#)とシャープ(♯)は違う文字なのか同じ文字なのかはっきりしない
  • ギリシャ文字のオメガ(Ω)と電気抵抗を表す単位のオーム(Ω)は 歴史的にも同じ活字印を使ったことがわかっている(が、違う文字として登録した)
  • 数学では普通のR(LATIN CAPITAL LETTER R)と太字のR(U+1D411 MATHEMATICAL BOLD CAPITAL R)、実数空間を参照するための白抜き文字のR(U+211D DOUBLE-STRUCK CAPITAL R)は違う文字だと主張がある
  • 数学用の文字、ベクトルや集合の記号に使う太字(U+1D468 MATHEMATICAL BOLD ITALIC CAPITAL Aなど)や ラプラス変換などで使う飾り文字みたいなの(U+1D504 MATHEMATICAL FRAKTUR CAPITAL Aなど)、白抜きの文字(U+1D538 MATHEMATICAL DOUBLE-STRUCK CAPTAL A)などどんどん追加されている

なので、ここらへんは雰囲気らしい

でも、これが元凶となってホモグラフ攻撃ができちゃうんだなぁ…

ツールを作った: funnychar

そんな訳でツールを作った

Instration

ファイルダウンロードして実行権限をつけるだけ

$ wget https://raintrees.net/attachments/download/712/funnychar
$ chmod u+x ./funnychar

最新版について

現在、githubにて最新版を管理しています。
https://github.com/kanata2003/funnychar

Usage

$ ./funnychar.sh -p 3 "abcABC def"
𝑎𝑏𝑐𝐴𝐵𝐶 𝑑𝑒𝑓
$ ./funnychar.sh -u U+1D63C "abcABC def" # 該当のAのコードポイントを指定する
𝙖𝙗𝙘𝘼𝘽𝘾 𝙙𝙚𝙛
$ echo "aあBCdef"|./funnychar.sh -p 4 # パイプ経由でも実行可能
𝒂あ𝑩𝑪𝒅𝒆𝒇

参考

以下のサイトを参考にさせて頂きました

*1 Unicodeの基礎知識 http://exlight.net/devel/unicode/basics.html

*2 図書館員のコンピュータ基礎講座 http://www.asahi-net.or.jp/~ax2s-kmtn/ref/unicode/alphanumeric.html

Unicode Utilities: Character Properties(文字のコードポイントを調べることができるサイト)
https://unicode.org/cldr/utility/character.jsp

RFC3454 国際化文字列の前処理("stringprep")
http://www.jdna.jp/survey/rfc/rfc3454j.html

数学用の文字などは国際化ドメイン名に使用できないことが決められている

PlainStyle ※同じような機能を持ったWebサービス
https://www.shapoco.net/plainstyle/

Homograph(ホモグラフ)についてかんがえてみる(かんがえるだけ)
https://io.cyberdefense.jp/entry/homograph%E3%83%9B%E3%83%A2%E3%82%B0%E3%83%A9%E3%83%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%8B%E3%82%93%E3%81%8C%E3%81%88%E3%81%A6%E3%81%BF%E3%82%8B%E3%81%8B%E3%82%93%E3%81%8C%E3%81%88%E3%82%8B%E3%81%A0%E3%81%91/

funnychar (3.14 KB) kanata, 2019/12/31 18:30

クリップボードから画像を追加 (サイズの上限: 100 MB)