Ruby 1.9.1 + Rails 2.3.2 の組み合わせで試しながら読んでいたら
16.9 Unicode Support のところでつまずく。
String#chars は、Enumerator で length というメソッドも reverse というメソッドも持ってない。
普通にindex.html.erbの中で
<td><%= person.name.reverse %></td>
とかやってみたら
invalid byte sequence in UTF-8
とか言われた。
試しに、
<td><%= person.name.encoding %></td>
としたら、ASCII-8BIT と表示した。
そこで、
<td><%= person.name.encode('UTF-8') %></td>
としたら
"\xE3" from ASCII-8BIT to UTF-8
とエラー(ちなみに、person.name は、テストのために「あ」にしている)。
そこで、
<td><%= person.name.force_encoding('UTF-8') %></td>
としてみたら
incompatible character encodings: ASCII-8BIT and UTF-8
とエラーになった。
しばらく悩んでいたのだが、原因がわかった。
Person#nameを参照するところで全てforce_encoding('UTF-8')すれば、よさそうである。
ということで Person.rb は
class Person < ActiveRecord::Base
def name
super.force_encoding('UTF-8')
end
end
と逃げて、更に駄目駄目だけど、よくわかんなかったので、index.html.erb は
<table border="1">
<tr>
<th>Name</th><th>Length</th><th>Bytesize</th><th>Reverse</th>
</tr>
<% for person in @people %>
<tr>
<td><%=h person.name %></td>
<td><%= person.name.length %></td>
<td><%= person.name.bytesize %></td>
<td><%=h person.name.reverse %></td>
</tr>
<% end %>
</table>
<% form_for :person do |form| %>
New name: <%= form.text_field :name, value:"" %>
<%= submit_tag "Add" %>
<% end %>
と逃げた。
きっともっと賢い方法があるに違いないけど今の私にはこれが限界。
最近のコメント