QA@IT

Haml で markdown (RDiscount) を使って日本語を扱うと Encoding::CompatibilityError が発生する

3329 PV

追記

エラーの本質が判明しましたのでタイトルを変更しました

Haml で Encoding::CompatibilityError が発生するHaml で markdown (RDiscount) を使って日本語を扱うと Encoding::CompatibilityError が発生する

markdown 側の問題だったのでタイトルに Haml を含むのはどうかとも思いますが,変わり過ぎるのも変かなと思いこうしました.


Haml のコード内に日本語 (utf-8) 文字列を挿入すると

Encoding::CompatibilityError at /
incompatible character encodings: UTF-8 and ASCII-8BIT

なエラーが発生してしまいます.

公式のドキュメントある人のブログエントリ などを見る限り,普通にマジックコメントを追加するだけで大丈夫なように見受けられるのですが,それを試してみても同じエラーが発生します.

このエラーが起こるサンプルプロジェクトを GitHub にアップしました

app.rbview/index.haml に手直しを加えてみた過程をコミットログとして残しています.

環境は以下の通りです.

  • OS: Ubuntu 12.04
  • Ruby 1.9.3-p374
  • Sinatra 1.3.4
  • Haml 4.0.0

どう解決すれば良いでしょうか?

回答

markdown :index, layout: false で返ってくる文字列の encoding が ASCII-8BIT となっているようです。

調べてみたところ Stackoverflow の この回答 が参考になりました。
これによると encoding の問題は Tilt のファイルの読み方に起因しているそうです。

既に IssuePull request が投げられていますが Close していないみたいですね。
今の段階だと、(参照先の回答にあるように)以下のような方法をとることができそうです。

= markdown(:index, layout: false).force_encoding('utf-8')

または

= markdown File.read('views/index.md'), layout: false

ほぼコピペですがご参考になれば。

編集 履歴 (1)
  • なるほど.index.haml に日本語を書くとエラーが発生することからそちらにばかり気を取られていましたが,markdown 側が utf-8 じゃないものを返していたことが原因だったのですね.

    markdown を使ったのは,そちらだけに日本語がある状態なら問題が無かったためです.完全にしてやられた感じです…

    どうもありがとうございました.
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。