ソースコード中に0xC2A0(UTF-8のNO-BREAK SPACE)が混ざり実行できなくて困った話

Tags: [ Ruby ] Published: 2013/08/26

あらすじ

あるソースコードをコピペして実行しようとしたところ、なんか動かない。(正確にはパッチファイルを適用しようとした)

目grep してみたところ、おかしいところはなさげである。

参考サイト

調査

動かないファイルを色々調べてみると以下のようなことがわかった。

  1. ソースコード上の「半角スペースらしき空白」(A) を「半角スペース」(B) (キーボードのスペースキーで出した空白)で検索しても 引っかからない
  2. この (A) と (B) は別ものらしく :s/(A)/(B)/ とかすると置換が実行される
  3. また、 (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側の仕様でこうなっちゃうのかな?

こういう話もあり↓

ただ、必ずそうなるわけではなく、何かを経由したときだけ変換される?

もうちょい調べてみないといけないな〜。

TODO

vi 、 emacs 、他(sedとか?)でうまく変換できるようにしたい。


Author: kk_Ataka / Powered by Jekyll on GitHub Pages