Funnychar¶
動機¶
Unicodeは字形を区別して登録しない
つまり a は a であり、 a としても a としても、全て同じ U+0041 として文字セットに登録されている
でも、あれ?インターネット上では似たような文字よく見るよね。。どうなっているんだろう。。
https://t.co/0NaB21BLiB pic.twitter.com/V9trr9tdYY
— シェル芸bot (@minyoruminyon) September 17 2019
似たような文字の整理¶
そこで、似たような字形のものを整理してみた
めっちゃ字形を区別して登録してますけど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/