ASCII コードではない半角の記号文字

## はじめに
みなさん [ASCII コード](https://ja.wikipedia.org/wiki/ASCII) 大好きですよね？
だって余計なトラブルが起きないですからね。

逆に言うと ASCII コード以外の文字って大嫌いですよね？
だって無用なトラブルが起きますからね。

しかし、 [Unicode](https://ja.wikipedia.org/wiki/Unicode) が一般的に使用されているのが現実ですよね？
これはもう覚悟を決めて ASCII 以外の文字に触れてみませんか？

そんなわけで、私が目についた **「 ASCII コードではない半角の記号文字」** の幾つかを紹介したいと思います。

:::note
【補足】全角文字・半角文字とは？
 [半角文字](https://ja.wikipedia.org/wiki/全角と半角)の、２倍幅で表示される文字が全角文字。
漠然とそう考えてこの記事を読んでみてください。


２倍幅ってのは厳密には違うのでは？とか、[等幅フォント](https://ja.wikipedia.org/wiki/等幅フォント) か [プロポーショナルフォント](https://ja.wikipedia.org/wiki/プロポーショナルフォント) で話が変わるだとか、、、
細かい話はあるわけですが、そこは目をつぶってください。
:::

## 悪いやつらの紹介
### ２つのスペース
* [スペース - Space](https://www.compart.com/en/unicode/U+0020):
普段、何気なく使っているスペース。もちろん ASCII.
エディタの機能で特殊表示するとかしないと、普通は見えない。
コンピュータの世界では [空白文字](https://ja.wikipedia.org/wiki/空白文字) , [区切り文字(デリミタ)](https://ja.wikipedia.org/wiki/区切り文字) として使われる特別なやつ。神。

* [ノーブレークスペース - No-Break Space (NBSP)](https://www.compart.com/en/unicode/U+00A0)
スペースと見た目は同じ。（というか見えないことのほうが多い）
<font color=yellow>もちろん空白文字や区切り文字としては使えないことが多いぞ。</font>
一つのドキュメント内にスペースと混在されると地獄が始まるよ。
「自分は ASCII 以外の文字を使わないから関係ない。」
と思っていたら、同僚が使っていて痛い目見ました。
なんてことは起き得ます。無関係ではいられない場合もありますよ。

 
以下に一例として [JSON](https://ja.wikipedia.org/wiki/JavaScript_Object_Notation) でのケースを挙げておきます。

 :::note
【参考】JSON で使用可能な空白文字について
[json の規格 (RFC8259)](https://datatracker.ietf.org/doc/html/rfc8259) - "2.  JSON Grammar" の章に空白文字 (whitespace) の規定があります。
CR, LF、Horizon TAB, Space の４つが使えると書いてあります。
すなわちノーブレークスペースは空白文字として扱われません。
インデント文字やコロンのあとに空白文字としてノーブレークスペースを使うと JSON の規格違反です。
　
ちなみによくある JSON 構文チェッカーについてですが、私が触ってみた感触では空白文字をチェックしてないものがありました。（バグ）
ご注意ください。
:::

### ハイフンとマイナス
* [ ハイフン - Hyphen-Minus (ASCII hyphen)](https://www.compart.com/en/unicode/U+002D) : -
普段ハイフンいうてるやつ。
慣例的に算術演算するときはもっぱらこの文字を使うことが多い。
というかほとんどなはずです。
マイナスの数値表現するときはこの文字だけ知って使っていれば、だいたい生きていける。
* [ マイナス - Minus Sign](https://www.compart.com/en/unicode/U+2212) : −
マイナスを表現する記号文字だが算術演算に使えないぞ。
半角文字なのでハイフンとほとんど見分けがつかないぞ。
> 【参考】https://ja.wikipedia.org/wiki/ハイフンマイナス
ほとんどのプログラミング言語では文字集合が ASCII に限られているため、
減算や負数を表すのにユニコードの U+2212 − minus sign ではなくハイフンマイナスを用いる[2][3]。

以下は、実際に Python で Minus Sign を入力した例（例外になるよ）
```python
>>> n = −1 # Minus Sign を入力してみた
  File "<stdin>", line 1
    n = −1
         ^
SyntaxError: invalid character in identifier
>>> n = -1 # こっちは Hyphen-Minus 
```
では、文字列の −1 (Minus Sign 1) を int に変換できるか？というと、できないんだなこれが。（以下参照）
```python
>>> s = "−1" # Minus Sign を入力してみた
>>> int(s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '−1'
>>> s = "-1" # こっちは Hyphen-Minus 
>>> int(s)
-1
```
ちなみに Python では ASCII 以外の文字を扱えないか？というとそんなことはない。
以下のように日本語の変数も扱える。
```python
>>> ああああ = 1
>>> print(ああああ)
1
```
ただし、数値型変数のマイナス値には Hyphen-Minus (ASCII hyphen) しか使えない。
そういうことなんでしょう。

以下はさらなる蛇足です。
> ハイフン・マイナス・enダッシュ・emダッシュの違いと使い分け
https://u.muroran-it.ac.jp/hydrogen/semi_dash01.html
>> マイナス / minus (−)　　負の数を表現する。
ハイフン / hyphen（-）　　接続して1語をつくる。
enダッシュ / en dash（–）　　範囲、関係を示す。
emダッシュ / em dash（—）　　区切り、分離を表す。
:::

### カンマとアラビア数値区切り記号
* [カンマ - Comma](https://www.compart.com/en/unicode/U+002C) : ,
普段使うふつうのカンマ。
[CSV](https://ja.wikipedia.org/wiki/Comma-Separated_Values) の区切り文字。

* [アラビア数値区切り記号 - Arabic Thousands Separator](https://www.compart.com/en/unicode/U+066C) : ٬
なんなんだこいつ、、、
もちろん CSV の区切り文字としては使えないぞ。

### セミコロンとギリシャの疑問符
* [セミコロン - Semicolon](https://www.compart.com/en/unicode/U+003B) : ;
C言語系だと行末というか文末に付けるとても特別な文字。

* [ギリシャの疑問符 - Greek Question Mark](https://www.compart.com/en/unicode/U+037E) : ;
ブラウザ上でセミコロンを検索するとこれもヒットしますが別の文字。
我々日本人にはなじみがない文字。
ギリシャ人にＣ言語は向いてないんだね。かわいそう。

### コロンと修飾文字コロン
* [コロン - Colon](https://www.compart.com/en/unicode/U+003A) : :
プログラム言語だとあたりまえに文法で使用する記号。

* [修飾文字コロン（？） - Modifier Letter Colon](https://www.compart.com/en/unicode/U+A789) : ꞉
こんなのあるんですね。頭が痛くなってきます。
これを使ってJSON を書いて人間を困らせる、なんてことはやってはいけません。

### 探せば他にもたくさんあるのでは？
メンタルヘルスがやられそうなので私はもう調べたくないです。

## 対策
ASCII 以外の文字はソースコードファイルから追い出したい。
けど、日本語コメント書く人がいると無理。

IDE のエディタなら自動でノーブレークスペースとかを除去してくれたり警告してくれたりできるとは思います。（多分）

あと、全部 ASCII で書かれたプレーンテキストのファイルは file コマンドを使うと ASCII と見えます。
以下は "abcd efgh" (スペース)と "abcd efgh" (ノーブレークスペース)をファイルに書いて file コマンドで調べた結果。
```python
user@TEST-PC:~$ python3 -c 'from pathlib import Path; Path("ascii_dump.txt").write_text("abcd efgh\n")'
user@TEST-PC:~$ cat ascii_dump.txt
abcd efgh
user@TEST-PC:~$ file ascii_dump.txt
ascii_dump.txt: ASCII text # ★★★
user@TEST-PC:~$ python3 -c 'from pathlib import Path; Path("no_ascii_dump.txt").write_text("abcd efgh\n")'
user@TEST-PC:~$ cat no_ascii_dump.txt
abcd efgh
user@TEST-PC:~$ file no_ascii_dump.txt
no_ascii_dump.txt: UTF-8 Unicode text # ★★★
```
ASCII か？のチェックにしかならないけれど、知ってて損はしない。