プロジェクト

全般

プロフィール

Funnychar » 履歴 » バージョン 1

kanata, 2025/04/13 14:06

1 1 kanata
# Funnychar
2
3
{{toc}}
4
5
# 動機
6
7
Unicodeは字形を区別して登録しない
8
つまり a は a であり、 **a** としても *a* としても、全て同じ U+0041 として文字セットに登録されている
9
でも、あれ?インターネット上では似たような文字よく見るよね。。どうなっているんだろう。。
10
11
{{rawhtml(<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/0NaB21BLiB">https://t.co/0NaB21BLiB</a> <a href="https://t.co/V9trr9tdYY">pic.twitter.com/V9trr9tdYY</a></p>&mdash; シェル芸bot (@minyoruminyon) <a href="https://twitter.com/minyoruminyon/status/1173972246324334593?ref_src=twsrc%5Etfw">September 17 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>)}}
12
13
## 似たような文字の整理
14
15
そこで、似たような字形のものを整理してみた
16
めっちゃ字形を区別して登録してますけどwww🤔🤔🤔
17
18
| CodePoint | Name | Detail| glyph(字形) |
19
|-----------|------|---------|-------------|
20
|U+0041 - U+005A|LATIN CAPITAL LETTER|ASCIIコード| ABCDEFGHIJKLMNOPQRSTUVWXYZ
21
|U+0061 - U+007A|LATIN SMALL LETTER  |ASCIIコード| abcdefghijklmnopqrstuvwxyz
22
|U+249C - U+24B5|PARENTHESIZED LATIN SMALL LETTER|括弧付きラテン文字| ⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵
23
|U+24B6 - U+24CF|CIRCLED LATIN CAPITAL LETTER|丸付きラテン文字| ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏ
24
|U+24D0 - U+24E9|CIRCLED LATIN CAPITAL SMALL|丸付きラテン文字| ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ
25
|U+FF21 - U+FF3A|FULLWIDTH LATIN CAPITAL|全角文字| ABCDEFGHIJKLMNOPQRSTUVWXYZ
26
|U+FF41 - U+FF5A|FULLWIDTH LATIN SMALL|全角文字| abcdefghijklmnopqrstuvwxyz
27
|U+1D400 - U+1D419|MATHEMATICAL BOLD CAPITAL|数学用|𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙
28
|U+1D41A - U+1D433|MATHEMATICAL BOLD SMALL|数学用| 𝐚𝐛𝐜𝐝𝐞𝐟𝐠𝐡𝐢𝐣𝐤𝐥𝐦𝐧𝐨𝐩𝐪𝐫𝐬𝐭𝐮𝐯𝐰𝐱𝐲𝐳
29
|U+1D434 - U+1D44D|MATHEMATICAL ITALIC CAPITA|数学用| 𝐴𝐵𝐶𝐷𝐸𝐹𝐺𝐻𝐼𝐽𝐾𝐿𝑀𝑁𝑂𝑃𝑄𝑅𝑆𝑇𝑈𝑉𝑊𝑋𝑌𝑍
30
|U+1D44E - U+1D467|MATHEMATICAL ITALIC SMALL|数学用| 𝑎𝑏𝑐𝑑𝑒𝑓𝑔𝑕𝑖𝑗𝑘𝑙𝑚𝑛𝑜𝑝𝑞𝑟𝑠𝑡𝑢𝑣𝑤𝑥𝑦𝑧
31
|U+1D468 - U+1D481|MATHEMATICAL BOLD ITALIC CAPITAL|数学用| 𝑨𝑩𝑪𝑫𝑬𝑭𝑮𝑯𝑰𝑱𝑲𝑳𝑴𝑵𝑶𝑷𝑸𝑹𝑺𝑻𝑼𝑽𝑾𝑿𝒀𝒁
32
|U+1D482 - U+1D49B|MATHEMATICAL BOLD ITALIC SMALL|数学用| 𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛
33
|U+1D49C - U+1D4B5|MATHEMATICAL SCRIPT CAPITAL |数学用| 𝒜𝒝𝒞𝒟𝒠𝒡𝒢𝒣𝒤𝒥𝒦𝒧𝒨𝒩𝒪𝒫𝒬𝒭𝒮𝒯𝒰𝒱𝒲𝒳𝒴𝒵
34
|U+1D4B6 - U+1D4CF|MATHEMATICAL SCRIPT SMALL|数学用| 𝒶𝒷𝒸𝒹𝒺𝒻𝒼𝒽𝒾𝒿𝓀𝓁𝓂𝓃𝓄𝓅𝓆𝓇𝓈𝓉𝓊𝓋𝓌𝓍𝓎𝓏
35
|U+1D4D0 - U+1D4E9|MATHEMATICAL BOLD SCRIPT CAPITAL|数学用| 𝓐𝓑𝓒𝓓𝓔𝓕𝓖𝓗𝓘𝓙𝓚𝓛𝓜𝓝𝓞𝓟𝓠𝓡𝓢𝓣𝓤𝓥𝓦𝓧𝓨𝓩
36
|U+1D4EA - U+1D503|MATHEMATICAL BOLD SCRIPT SMALL|数学用| 𝓪𝓫𝓬𝓭𝓮𝓯𝓰𝓱𝓲𝓳𝓴𝓵𝓶𝓷𝓸𝓹𝓺𝓻𝓼𝓽𝓾𝓿𝓿𝔀𝔁𝔂𝔃
37
|U+1D504 - U+1D51D|MATHEMATICAL FRAKTUR CAPITAL|数学用| 𝔄𝔅𝔆𝔇𝔈𝔉𝔊𝔋𝔌𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔕𝔖𝔗𝔘𝔙𝔚𝔛𝔜𝔝
38
|U+1D51E - U+1D537|MATHEMATICAL FRAKTUR SMALL|数学用| 𝔞𝔟𝔠𝔡𝔢𝔣𝔤𝔥𝔦𝔧𝔨𝔩𝔪𝔫𝔬𝔭𝔮𝔯𝔰𝔱𝔲𝔳𝔴𝔵𝔶𝔷
39
|U+1D538 - U+1D551|MATHEMATICAL DOUBLE-STRUCK CAPITAL|数学用| 𝔸𝔹𝔺𝔻𝔼𝔽𝔾𝔿𝕀𝕁𝕂𝕃𝕄𝕅𝕆𝕇𝕈𝕉𝕊𝕋𝕌𝕍𝕎𝕏𝕐𝕑
40
|U+1D552 - U+1D56B|MATHEMATICAL DOUBLE-STRUCK SMALL|数学用| 𝕒𝕓𝕔𝕕𝕖𝕗𝕘𝕙𝕚𝕛𝕜𝕝𝕞𝕟𝕠𝕡𝕢𝕣𝕤𝕥𝕦𝕧𝕨𝕩𝕪𝕫
41
|U+1D56C - U+1D585|MATHEMATICAL BOLD FRAKTUR CAPITAL|数学用| 𝕬𝕭𝕮𝕯𝕰𝕱𝕲𝕳𝕴𝕵𝕶𝕷𝕸𝕹𝕺𝕻𝕼𝕽𝕾𝕿𝖀𝖁𝖂𝖃𝖄𝖅
42
|U+1D586 - U+1D59F|MATHEMATICAL BOLD FRAKTUR SMALL|数学用| 𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟
43
|U+1D5A0 - U+1D5B9|MATHEMATICAL SANS-SERIF CAPITAL|数学用| 𝖠𝖡𝖢𝖣𝖤𝖥𝖦𝖧𝖨𝖩𝖪𝖫𝖬𝖭𝖮𝖯𝖰𝖱𝖲𝖳𝖴𝖵𝖶𝖷𝖸𝖹
44
|U+1D5BA - U+1D5D3|MATHEMATICAL SANS-SERIF SMALL|数学用| 𝖺𝖻𝖼𝖽𝖾𝖿𝗀𝗁𝗂𝗃𝗄𝗅𝗆𝗇𝗈𝗉𝗊𝗋𝗌𝗍𝗎𝗏𝗐𝗑𝗒𝗓
45
|U+1D5D4 - U+1D5ED|MATHEMATICAL SANS-SERIF BOLD CAPITAL|数学用| 𝗔𝗕𝗖𝗗𝗘𝗙𝗚𝗛𝗜𝗝𝗞𝗟𝗠𝗡𝗢𝗣𝗤𝗥𝗦𝗧𝗨𝗩𝗪𝗫𝗬𝗭
46
|U+1D5EE - U+1D607|MATHEMATICAL SANS-SERIF BOLD SMALL|数学用| 𝗮𝗯𝗰𝗱𝗲𝗳𝗴𝗵𝗶𝗷𝗸𝗹𝗺𝗻𝗼𝗽𝗾𝗿𝘀𝘁𝘂𝘃𝘄𝘅𝘆𝘇
47
|U+1D608 - U+1D621|MATHEMATICAL SANS-SERIF ITALIC CAPITAL|数学用| 𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡
48
|U+1D622 - U+1D63B|MATHEMATICAL SANS-SERIF ITALIC SMALL|数学用| 𝘢𝘣𝘤𝘥𝘦𝘧𝘨𝘩𝘪𝘫𝘬𝘭𝘮𝘯𝘰𝘱𝘲𝘳𝘴𝘵𝘶𝘷𝘸𝘹𝘺𝘻
49
|U+1D63C - U+1D655|MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL|数学用| 𝘼𝘽𝘾𝘿𝙀𝙁𝙂𝙃𝙄𝙅𝙆𝙇𝙈𝙉𝙊𝙋𝙌𝙍𝙎𝙏𝙐𝙑𝙒𝙓𝙔𝙕
50
|U+1D656 - U+1D66F|MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL|数学用| 𝙖𝙗𝙘𝙙𝙚𝙛𝙜𝙝𝙞𝙟𝙠𝙡𝙢𝙣𝙤𝙥𝙦𝙧𝙨𝙩𝙪𝙫𝙬𝙭𝙮𝙯
51
|U+1D670 - U+1D689|MATHEMATICAL MONOSPACE CAPITAL|数学用| 𝙰𝙱𝙲𝙳𝙴𝙵𝙶𝙷𝙸𝙹𝙺𝙻𝙼𝙽𝙾𝙿𝚀𝚁𝚂𝚃𝚄𝚅𝚆𝚇𝚈𝚉
52
|U+1D68A - U+1D6A3|MATHEMATICAL MONOSPACE SMALL|数学用| 𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚢𝚣
53
|U+1F110 - U+1F129|PARENTHESIZED LATIN CAPITAL LETTER|括弧付きラテン文字| 🄐🄑🄒🄓🄔🄕🄖🄗🄘🄙🄚🄛🄜🄝🄞🄟🄠🄡🄢🄣🄤🄥🄦🄧🄨🄩
54
|U+1F130 - U+1F149|SQUARED LATIN CAPITAL LETTER|四角付きラテン文字| 🄰🄱🄲🄳🄴🄵🄶🄷🄸🄹🄺🄻🄼🄽🄾🄿🅀🅁🅂🅃🅄🅅🅆🅇🅈🅉
55
|U+1F150 - U+1F169|NEGATIVE CIRCLED LATIN CAPITAL LETTER|白抜き黒丸付きラテン文字| 🅐🅑🅒🅓🅔🅕🅖🅗🅘🅙🅚🅛🅜🅝🅞🅟🅠🅡🅢🅣🅤🅥🅦🅧🅨🅩
56
|U+1F170 - U+1F189|NEGATIVE SQUARED LATIN CAPITAL LETTER|白抜き黒四角付きラテン文字| 🅰🅱🅲🅳🅴🅵🅶🅷🅸🅹🅺🅻🅼🅽🅾🅿🆀🆁🆂🆃🆄🆅🆆🆇🆈🆉
57
|U+1F1E6 - U+1F1FF|REGIONAL INDICATOR SYMBOL LETTER|地域指示記号| 🇦🇧🇨🇩🇪🇫🇬🇭🇮🇯🇰🇱🇲🇳🇴🇵🇶🇷🇸🇹🇺🇻🇼🇽🇾🇿
58
59
## 似たような文字だけど区別された理由
60
61
こんな理由で区別されているようです^*2
62
63
| Block            | Name                              | CodePoint        | Detail   |
64
|------------------|-----------------------------------|------------------|----------|
65
| 数学用英数字記号 | Mathematical Alphanumeric Symbols | U+1D400~U+1D7FF | 英数字を様々な書体で表した形式の記号です。数学や技術的な表記以外での使用は禁じられています。
66
| 囲み英数字       | Enclosed Alphanumerics            | U+2460~U+24FF   | リスト上の順序を表わすために用いられる英数字です。ほとんどは東アジアの既存の規格との互換用です。
67
| 囲み英数字補助   | Enclosed Alphanumeric Supplement  | U+1F100~U+1F1FF | 日本のデータ放送規格ARIB STD B24や携帯電話の絵文字との互換用の英数字、地域コードを表現するためのラテン文字などです。
68
69
## The Unicode Consortium の努力
70
71
ユニコードコンソーシアムはがんばって以下の定義で区別しようとしたようです
72
Unicodeは、文字(character),グリフ(glyph),フォント(font)の定義があり、文字毎にコードポイントに登録している^*1
73
74
| 単語     |意味|
75
|----------|----|
76
| 文字     | 言語において意味をもつ最小単位。特定の形状のことを指すものではなく、抽象的な意味と抽象的な形状のことを指す
77
| グリフ   | 文字が描画あるいは表示されるときに持ちうる形状を表現するもの
78
| フォント | 文字の視覚的表現のために使われるグリフを集めたもの
79
80
ふんふん、そうだよね。だからグリフによらずaはa(U+0041)なんだよね
81
でも、どうやら
82
83
### 文字とグリフの間に明確な境界があるわけではない
84
85
ということらしい。例えば^*1
86
87
* ナンバーサイン(#)とシャープ(♯)は違う文字なのか同じ文字なのかはっきりしない
88
*  ギリシャ文字のオメガ(Ω)と電気抵抗を表す単位のオーム(Ω)は 歴史的にも同じ活字印を使ったことがわかっている(が、違う文字として登録した)
89
* 数学では普通のR(LATIN CAPITAL LETTER R)と太字のR(U+1D411 MATHEMATICAL BOLD CAPITAL R)、実数空間を参照するための白抜き文字のR(U+211D DOUBLE-STRUCK CAPITAL R)は違う文字だと主張がある
90
* 数学用の文字、ベクトルや集合の記号に使う太字(U+1D468 MATHEMATICAL BOLD ITALIC CAPITAL Aなど)や ラプラス変換などで使う飾り文字みたいなの(U+1D504 MATHEMATICAL FRAKTUR CAPITAL Aなど)、白抜きの文字(U+1D538 MATHEMATICAL DOUBLE-STRUCK CAPTAL A)などどんどん追加されている 
91
92
なので、ここらへんは雰囲気らしい
93
94
>でも、これが元凶となって[ホモグラフ攻撃](https://ja.wikipedia.org/wiki/%E3%83%9B%E3%83%A2%E3%82%B0%E3%83%A9%E3%83%95%E6%94%BB%E6%92%83)ができちゃうんだなぁ…
95
96
# ツールを作った: funnychar
97
98
そんな訳でツールを作った
99
100
## Instration
101
102
ファイルダウンロードして実行権限をつけるだけ
103
104
```bash
105
$ wget https://raintrees.net/attachments/download/712/funnychar
106
$ chmod u+x ./funnychar
107
```
108
109
### 最新版について
110
111
現在、githubにて最新版を管理しています。
112
https://github.com/kanata2003/funnychar
113
114
## Usage
115
116
```bash
117
$ ./funnychar.sh -p 3 "abcABC def"
118
𝑎𝑏𝑐𝐴𝐵𝐶 𝑑𝑒𝑓
119
$ ./funnychar.sh -u U+1D63C "abcABC def" # 該当のAのコードポイントを指定する
120
𝙖𝙗𝙘𝘼𝘽𝘾 𝙙𝙚𝙛
121
$ echo "aあBCdef"|./funnychar.sh -p 4 # パイプ経由でも実行可能
122
𝒂あ𝑩𝑪𝒅𝒆𝒇
123
```
124
125
# 参考
126
127
以下のサイトを参考にさせて頂きました
128
129
*1 Unicodeの基礎知識 http://exlight.net/devel/unicode/basics.html
130
131
*2 図書館員のコンピュータ基礎講座 http://www.asahi-net.or.jp/~ax2s-kmtn/ref/unicode/alphanumeric.html
132
133
Unicode Utilities: Character Properties(文字のコードポイントを調べることができるサイト)
134
https://unicode.org/cldr/utility/character.jsp
135
136
RFC3454 国際化文字列の前処理("stringprep")
137
http://www.jdna.jp/survey/rfc/rfc3454j.html
138
139
> 数学用の文字などは国際化ドメイン名に使用できないことが決められている
140
141
PlainStyle ※同じような機能を持ったWebサービス
142
https://www.shapoco.net/plainstyle/
143
144
Homograph(ホモグラフ)についてかんがえてみる(かんがえるだけ)
145
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/