レールとエンコーディングについて多くの質問があることは知っていますが、この特定の質問については何も見つかりませんでした。
rails 3.1.3
を使用して実行しているRubyonRailsアプリケーションがありますJruby 1.6.7
。私たちは英語とフランス語の両方をサポートしています-そしてI18n
これを達成するためにlibrary/gemを使用しています。
翻訳ファイルのパーツの例:
#---- config/locales/en.yml ----
en:
button_label_verify: "Verify"
#---- config/locales/fr.yml ----
fr:
button_label_verify: "Vérifier"
場合によっては、次のエンコードエラーが発生します。
Internal Server Error: Encoding::CompatibilityError incompatible character encodings: UTF-8 and ASCII-8BIT
ケース1:
#---- app/views/_view_page.html.erb ----
.....
<h3><%= get_button_label() %></h3>
....
#---- app/helpers/page_helper.rb ----
def get_button_label
return I18n.t(:button_label_verify)
end
これは機能します-エンコードエラーはなく、フランス語と英語の間の翻訳は問題なく機能します。
ケース2:
#---- app/views/_view_page.html.erb ----
.....
<h3><%= get_button_label() %></h3>
....
#---- app/helpers/page_helper.rb ----
def get_button_label
return "#{I18n.t(:button_label_verify)}"
end
ただし、これは機能しません。唯一の違いは、返される値には、次のようなものではなく、文字列に計算されたコードを含む文字列が含まれることです。
return "string " + I18n.t(:button_label_verify)
注:上記でもエラーは発生しません。エンコードの問題は、計算されたI18n変換が引用符で囲まれている場合にのみ発生します。
ケース3:
#---- app/views/_view_page.html.erb ----
.....
<h3><%= "#{I18n.t(:button_label_verify)}" %></h3>
....
これはエラーを引き起こしません...したがって、問題は、ヘルパー関数から返された文字列を出力することに加えて、文字列内の動的コード(フランス語の文字を含む)に何らかの形で関連しているようです。
私はこれを回避/修正する方法を知っています-しかし、私が疑問に思っているのは、なぜそれがこのようになっているのかについて誰かが何らかの洞察を提供できるかどうかです-それは何らかの正当な理由でこの方法ですか?IMO、低レベルになると、文字列を印刷すると文字列が印刷されるので、ある方法でエラーが発生し、別の方法では発生しないことがわかりません。