I have an data-file stored with utf-8 encode, and I want to embed the data to an erb
template. The data-file is explicitly encoded with utf-8 at the top. But while running the erb engine but I encounter Encoding::CompatibilityError
Error.
I thought as the default encoding in Ruby is ASCII, the erb template must also encoded under ascii. I have explicitly changed it to utf-8 but there is no good.
Here is the data-file:
# coding: utf-8
samples: [
{ name: '北京', city: '北京' }
]
Here is the Erb template:
<% # -*- coding: UTF-8 -*- %>
#...
<p><%= samples[:name] %></p>
(I decided to write different answer)
Two issues, I think.
- datafile encoding on input
- how you output
The erb library knows about the encoding specification in magic comments, but the data file part, you need to take care by yourself. So, when you read the file, you have to specify encoding, or specify default encoding beforehand.
On output, you need to specify the encoding for output. You can specify per I/O channel basis.
To specify default encoding (easiest), you can:
Encoding.default_external = "UTF-8"
to use UTF-8 for all I/O.
If you're using Rails, have you configured default encoding, in application.rb
? like:
config.encoding = "utf-8"
My Rails (3.2.1) project does not contain any configuration other than that.
Other thing you want to check is, whether your datafile really in UTF-8 or not.
If you're using Unix-like system, you can use 'nkf' command to check the code, by:
nkf --guess FILE_NAME
Specify <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
in the header of the template
In the scenario where you have an ERB template rendering strings from another file that is in UTF-8, adding the following to the top of the ERB template solved it for me:
<%# coding: UTF-8 %>
(instead of <% # -*- coding: UTF-8 -*- %>
)