UTF-8(BOM付)で意図しない文字列が表示される対応メモ

ソースに意図してない ? が入ってハマった対応。

環境

  • OS: Ubuntu 12.04 64bit
  • Ruby: ruby 1.8.7 (2012-02-08 patchlevel 358) [x86_64-linux]
  • rvm: rvm 1.14.3 (stable)
  • Ruby on Rails: 3.2.6

? がソースに勝手に入る

問題のソース。

app/views/layouts/application.html.erb
1
2
3
4
5
6
7
8
<html>
<head>
<title>hoge</title>
</head>
<body>
<%= yield %>
</body>
</html>
app/views/hoge/index.html.erb
1
Hello Hoge!!
app/controllers/hoge_controller.rb
1
2
3
4
5
class HogeController < ApplicationController
def index

end
end

出力結果。

/hoge/index
1
2
3
4
5
6
7
8
9
<html>
<head>
<title>hoge</title>
</head>
<body>
?
Hello Hoge!!
</body>
</html>

yield 部分に勝手に ? が入ってる。
もちろんブラウザで見ても同位置に ? が表示される。

試しに yieldtapp してみる。

app/views/layouts/application.html.erb
1
2
3
4
5
6
7
8
<html>
<head>
<title>hoge</title>
</head>
<body>
<%= yield.tapp %>
</body>
</html>

出力結果。

Terminal
1
2
3
4
   (1.7ms)  COMMIT
Completed 200 OK in 45ms (Views: 22.2ms | ActiveRecord: 2.7ms)
"\n
Hello Hoge!!"

ログには出ないが、コピペしてみると謎の文字列 <feff> が出現。

原因

<feff> を調べてみると BOM であることがわかった。

バイトオーダーマーク

バイトオーダーマーク (byte order mark) あるいはバイト順マーク(バイトじゅんマーク)は通称BOM(ボム)といわれる、Unicodeの符号化形式で符号化したテキストの先頭につける数バイトのデータのことである。このデータを元にUnicodeで符号化されていることおよび符号化の種類の判別に使用する。

そこで、 vim でファイルを開くときに -b のBOM表示オプションをつけて開いてみる。

Terminal
1
$ vim -b app/views/hoge/index.html.erb

表示された内容がこれ。

app/views/hoge/index.html.erb
1
<feff>Hello Hoge!!

頭に <feff> の文字が表示されました。
これを削除すると正常に表示されました。

以上です。

© 2018 磁力式駆動 All Rights Reserved.
Theme by hiero