Unicodeでつまずく
プログラム書いてると、目視すれば明らかにあっているのに、予想したような答えにならない!てなことはよくある。
だいたい、自分の不注意。
しかし極たまにその「だいたい」に例外的に当てはまらないときがあって、
一例として日本語文字列操作のとき。
今日自分がTAをやっている授業で、emacsを使う生徒にそういう類の災難が。
「"… で … “ = ”… で … “ が false にevalされる。なんで??」
と困っている生徒。
emacs上でevalしても、
ターミナル上のOCaml対話モードで実行しても同じ結果。
ぐっ、これはUnicodeのアレがアレでこうでは…
こういういわゆる汚い部分は実は去年結構聞いたことがあった。
(汚いと言っては失礼かもしれない、けど実際汚い。)
数学やってるときに、「レジスタにこの数字を mov してー」と言わない。
日本語話すときに、「その発音を文字コードに書きあらわすとー」とか言わない。
まるで数学の式を書くようにプログラムを描きたいし、喋るように日本語をpcに打ちたい。
そんな願望を叶えるため、裏方でわっせわっせと汚い部分と触れ合っているお方がインターン先にいらっしゃった。
実際自分もインターン初期頃に bidi 関連の小さいバグを直していて、
そしてインターン先で初めて気づいた。
「あらゆる言語を表示すんのって、大変なんだな…」
初めてそっちの話を聞いたときは、あまりにも日常にない会話だったので目眩がした記憶があるw
まあ実際、私もそのときになるまでそのへんの汚い問題は知らなかった。
先代(?)が標準作ってわっせわっせ綺麗に隠蔽してくれてたので、
そんな汚いところは知らず平和に生活をしていたわけである。
(汚い汚い連呼してすみません。。)
しかし、先に戻って、このエラーである。
「"… で … “ = ”… で … “」
一体どうしてこの右の「で」が「で」ではなく「で」になってしまったのかわからないが、
で (\u3067)
で (\u3066\u3099)
この見た目が同じ「で」っぽく見える二つが混在してたのが原因。
ばびぶべぼ
(\u3070\u3073\u3076\u3079\u307C)
ばびぶべぼ
(\u306F\u3099\u3072\u3099\u3075\u3099\u3078\u3099\u307B\u3099)
う、う、、
/(>__<)\
結合文字つかった濁音つきの文字は、
後ろにカーソルキー合わせて delete キー押すとその結合文字だけ消えるし。
前方の文字に結合しているから、カーソル移動させても2つ飛ばしになるし。
emacs で、結合文字使った濁音を入力する方法あるんだろうか。
(外部からのコピペではなく、素直に入力して)
一体この「で (\u3066\u3099)」どこからきたのか、結局わからなかった。
私もエディタ作らないと、この類の問題には触れ合えないきがするぞ。。
しかし、下の参考にした3つ目のサイトも言っているが、ページ内検索すると
「で (\u3067)」「で (\u3066\u3099)」どっちもハイライトされてるのが微笑ましい(^ - ^ ))にこにこ….
見た:
Text Escaping and Unescaping in JavaScript