rubyを書いているのだが、結構意外なところではまって、時間を費やしてしまったのでメモしておく。

 どうやらUTF-8にはUTF-8とUTF-8Nの2種類がある。それらの違いは、UTF-8ではBOM(Byte Order Mark)と呼ばれる、エンディアンを判定するためのデータが先頭3バイトに書き込まれ、UTF-8Nでは書き込まれないというもの。
(追記20080401:コメントでご指摘をいただいたように、上の表記は適切ではありません。正しくは「UTF-8」では基本的にBOMは付与されず、BOMが付与された場合に限り「UTF-8BOM」などの表記を与えて区別するべきであるようです。wikipadia「UTF-8」 本来であればすべての表記を変更すべきですが、ここではTerePadがBOMつきのUTF-8を「UTF-8」、BOMなしのUTF-8を「UTF-8N」と表記を使用しているため、そのままにしました。混乱を与えてしまい申し訳ありません)

  なんの気なしにTeraPadで「UTF-8」で保存していたのだが、どうやらこのBOMがくせ者というか、shebang行(#! /usr/local/bin/ruby)が認識されずにただのシェルスクリプト扱いになり、エラー出しまくりになるわ、rubyから直接実行してもエ ラーになるわで結構はまった。

% less test.rb
<U+FEFF>#!/usr/local/bin/ruby
puts "hello."
% ruby test.rb
test.rb:1: Invalid char `\\357' in expression
test.rb:1: Invalid char `\\273' in expression
test.rb:1: Invalid char `\\277' in expression
% ./test.rb
./test.rb: #!/usr/local/bin/ruby: not found
puts: not found

 lessしたときに見える先頭の<U+FEFF>がBOMである。
 うーむ、このBOM、viでは見えなかったりして、というかBOMを適切に対処するようなエディタは見せないので、結構見つかりにくいワナだった。
 要するに、rubyコードもシェルスクリプトも「UTF-8N」で保存しなさいよっと。

 ただし、flashなどではBOM付きでないと不具合があるという話もあるので、使い分けが必要ですね。

 あとどうでもいいことだが、perlやrubyはshebang行を認識しているらしく「perl test.rb」など、rubyコードが書かれているものをperlで実行しようとしてもちゃんとrubyで実行してた。

--
*参考文献*
mieki256's diary - utf8 と utf8n の違いってなんでしょか
[ruby-dev:32982] Re: BOM of UTF-8