[#44310] プログラムに対して意図したとおりの文字列を渡す方法 — "Information Kanasansoft" <kanasansoft@...>

kanasanです。

9 messages 2007/12/05

[#44332] クラス:相互参照系の作成方法について質問です — "Saburoh Sakai" <sabroh@...>

はじめまして、さかいと申します。

12 messages 2007/12/11

[#44366] Rake改善プロジェクト — "Hajime Hoshi" <hajimehoshi@...>

東京大学修士 1 年の星一と申します。

14 messages 2007/12/19

[ruby-list:44420] 1.9.0のERBでマルチバイトが扱えません

From: "MATSUOKA Kohei" <kmachu@...>
Date: 2007-12-28 14:23:49 UTC
List: ruby-list #44420
こんばんは。まちゅといいます。

Ruby1.9.0のリリース、おめでとうございます。
さて、1.9.0上でtDiaryを動かそうとしていて気がついたのですが、
ERBに渡したテンプレートのencodingが欠落してしまうようです。
そのため、ERBでマルチバイトを含む文字が扱えません。

状況を整理しましたので、こちらで報告します。

* 環境
ruby 1.9.0 (2007-12-25 revision 14709) [i386-freebsd6.1]

* 再現方法
以下のサンプルで試しました。
----
require 'erb'

data = "データ"
rhtml = "テンプレート + <%= data %>"
erb = ERB.new(rhtml)

puts "data: #{data.encoding}"
puts "rhtml: #{rhtml.encoding}"
puts "erb.src: #{erb.src.encoding}"
puts erb.result(binding)
----

サンプルを実行すると、rhtmlのencodingがEUC-JPから
ASCII-8BITへと変わってしまい、文字列の連結に失敗します。

----
$ ruby --encoding=EUC-JP test.rb
data: EUC-JP
rhtml: EUC-JP
erb.src: ASCII-8BIT    ← ここがEUC-JPからASCII-8BITに変わっている
(erb):1:in `concat': character encodings differ (ArgumentError)
----


* 対処方法
正しいかどうかの自信はないのですが、
ERB#initialize でテンプレートと同じencodingを指定することで
先ほどのサンプルは期待通り動作するようになりました。

----
--- erb.rb.org  Fri Dec 28 23:05:02 2007
+++ erb.rb      Fri Dec 28 23:05:18 2007
@@ -689,6 +689,7 @@
    compiler = ERB::Compiler.new(trim_mode)
    set_eoutvar(compiler, eoutvar)
    @src = compiler.compile(str)
+    @src.force_encoding(str.encoding)
    @filename = nil
  end
----

-- 
MATSUOKA Kohei < http://www.machu.jp/diary/ >

In This Thread

Prev Next