ソースコード中に0xC2A0(UTF-8のNO-BREAK SPACE)が混ざり実行できなくて困った話
あらすじ
あるソースコードをコピペして実行しようとしたところ、なんか動かない。(正確にはパッチファイルを適用しようとした)
目grep してみたところ、おかしいところはなさげである。
参考サイト
-   は半角スペースではないというお話 (フェンリル デベロッパーズブログ)
- UTF-8の0xC2A0問題 【ブログ掲載のソースをコピペして、動作しないときに疑うべきこと】 某氏の猫空
- 文字コードC2A0(UTF-8の半角空白)なんてあるんですね at softelメモ
- Trimでも消えないスペースって? 文字コードC2A0 サイトスパイラル(Sitespiral)
- UTF-8の半角スペースについて - とりあえず落ち着け
- ノーブレークスペース - Wikipedia
調査
動かないファイルを色々調べてみると以下のようなことがわかった。
- ソースコード上の「半角スペースらしき空白」(A) を「半角スペース」(B) (キーボードのスペースキーで出した空白)で検索しても 引っかからない
- この (A) と (B) は別ものらしく
:s/(A)/(B)/
とかすると置換が実行される - また、 (A) を (B) に置換した状態だとエラーが出ずに実行できるようになった
「半角スペースらしき空白」が半角スペースではない何かのため、実行できなくなっていた模様。
ということで、この「半角スペースらしき空白」を抽出してバイナリエディタで見てみた。
a b c
一応テキトウな文字で挟んでみる。
a と b の間
が「半角スペースらしき空白」b と c の間
が「半角スペース」
とした。
見てみると…。
61 C2 A0 62 20 63
61
62
63
はそれぞれ a
b
c
で、 20
は 半角スペース
であるというところまではOK。
残ったのは C2A0
。
文字 | 備考 | 文字コード |
---|---|---|
” ” | SPACE (U+0020) | 20 |
a | LATIN SMALL LETTER A (U+0061) | 61 |
b | LATIN SMALL LETTER B (U+0062) | 62 |
c | LATIN SMALL LETTER C (U+0063) | 63 |
” ” | NO-BREAK SPACE (U+00A0) | c2a0 |
「半角スペースらしき空白」は NO-BREAK SPACE という文字で htmlで使う
と同じもの。
表示する分には(レイアウトなどに気を付ける必要はあるものの)特に問題はないが、ソースコードの空白としては不適切。
本文の C2A0
を半角スペース 20
に置換してやる事でソースコードはソースコードとしてよみがえる。
ところで、冒頭で「あるソースコード」としたコードだけど、これの出所はEvernoteにストックしておいたものだった。
いったんノートに取り込んでしまうと、Evernote側の仕様でこうなっちゃうのかな?
こういう話もあり↓
Evernoteは半角スペースを複数入力すると、内部的には がちょこちょこ入れられて、enmlなんかにも0xC2 0xA0というバイト列が入るんだな。vimで開いても単なるスペースにしか見えないので気付かなかった
— かと (@orangain) July 29, 2013
ただ、必ずそうなるわけではなく、何かを経由したときだけ変換される?
もうちょい調べてみないといけないな〜。