RailsでSJISの一部文字が使えない。
Rails 2.1 で Shift-JIS - 涅ir槃naのように設定したところ普通の文字は使えるのだが「表」「索」「照」「会」といった漢字が使えない。「憂鬱」とかは使えるのに・・・
どんなエラーになるかというと以下のようなエラーで
SyntaxError in GaraponController#garapon C:/temp/sjis/app/controllers/garapon_controller.rb:3: unterminated string meets end of file C:/temp/sjis/app/controllers/garapon_controller.rb:3: syntax error, unexpected $end, expecting kEND
ソースコードを解析している時点で該当文字(例えば表なら)がでると「\225\」と扱われリテラルが閉じられていないと判断しエラーとなっていると思われる。これはるびまの正規表現の回のところと同じような事象だろう。
例えば Shift_JIS で書かれた
http://jp.rubyist.net/magazine/?0020-BundledLibraries
p /表/s
というプログラム sample.rb があったとき、そのまま実行するとパース時は $KCODE が "NONE" なので、「表」が "\225\" として扱われて、2 バイト目が「\」なので、正規表現を閉じるはずの「/」がエスケープされてしまって、正規表現を閉じる部分がみつからずに
% ruby sample.rb
sample.rb:1: unterminated string meets end of file
sample.rb:1: syntax error, unexpected tSTRING_END, expecting
tSTRING_CONTENT or tREGEXP_END or tSTRING_DBEG or tSTRING_DVAR
となり、パースに失敗してしまうことがわかります。
しかしなんでこれが上記のようになってしまうのがが分からない。
config/environment.rb の先頭で、以下のようにKCODE を SJIS に設定しているのだがこれではダメなのか?
$KCODE = "sjis"
KCODEがだめなら「-Ks」オプションでいってみようと以下のようにしてもだめ
ruby -Ks script\server
ソースファイルもSJISで保存されているのを確かめたのだが、、
何が悪いんだろう。
11/27追記
原因及び対策が分かりました!
ApplicationControllerで&KCODEをうわがけばよい。詳しくは↓
Rails2.1でSJISを使う時に気をつける事 - 自分の仕事を憎むには人生は余りにも短い
追記ここまで
作業のログ及びソース
C:\temp>rails -v Rails 2.1.2 C:\temp>rails sjis create create app/controllers create app/helpers … C:\temp\sjis>ruby script\generate controller garapon garapon exists app/controllers/ exists app/helpers/ create app/views/garapon exists test/functional/ create app/controllers/garapon_controller.rb create test/functional/garapon_controller_test.rb create app/helpers/garapon_helper.rb create app/views/garapon/garapon.html.erb
config/environment.rb
$KCODE = "sjis" # Be sure to restart your server when you modify this file RAILS_GEM_VERSION = '2.1.2' unless defined? RAILS_GEM_VERSION # Bootstrap the Rails environment, frameworks, and default configuration require File.join(File.dirname(__FILE__), 'boot') Rails::Initializer.run do |config| config.time_zone = 'UTC' config.action_controller.default_charset = 'Shift_JIS' config.action_controller.session = { :session_key => '_sjis_session', :secret => '22739abb466c26ba0c943f24344f1225305fae2b7690e42de9b98b08a1abde841ff806dc0e68d1869db61a763456687aa7b9bf84b54f8d3c48b6983d3784c6ce' } end
app/views/layouts/application.html.erb
<?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja-JP" lang="ja-JP"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" /> <title>SJISサイト</title> </head> <body> <%= yield %> </body> </html>
app/views/garapon/garapon.html.erb
Garapon#garapon <%= @word %>
app/controllers/garapon_controller.rb
class GaraponController < ApplicationController def garapon @word = 'ああああああああ' #=>ここが「表」だと落ちる end end