Ruby on Rails 4,不兼容的字符编码:latin1

时间:2015-01-29 09:29:55

标签: ruby-on-rails ruby character-encoding latin1

我在rails 4中的web应用程序中遇到charset编码/解码问题。 我在我的网页上看到像“rappresentò”或“Ô这样的词,但我想看到“rappresentò”和“è”。

这是我的堆栈结构:

服务器Os:Ubuntu 14.04, MySQL的 数据库:“foo”, 表:“bar”

table description : 

|description 
| mediumtext
| latin1_swedish_ci 
| YES |....

这是我在rails中的数据库配置

default: &default    adapter: mysql2    encoding: latin1    pool: 5    username: root    password: ****    socket: ....
在rails视图中

meta-charset is "ISO-8859-1"

注意:   - 我只在服务器机器上反映了这个问题   - 当我通过ssh连接到数据库时,我正确地看到了字符

这是我在rails console中的输出:

Bar.find(38).description
Il volume è arricchito dalle illustrazioni di Jean-Jacques Sempé. "

1 个答案:

答案 0 :(得分:0)

在我看来,终端的编码是ISO-8859-1,对于重音e,字符串包含序列\xC3\xA8。但是在ISO-8859-1中,你有这个:

\xC3  --> Ã
\xA8  --> ¨

而且,这就是您在ISO-8859-1终端中看到的输出。

UTF-8中,序列\xC3\xA8碰巧代表一个字符:è。因此,这意味着您在数据库中为\xC3\xA8插入了UTF-8序列è - 而不是ISO-8859-1的{​​{1}}序列,即è

\xE8

因为UTF-8: è -> \xC3\xA8 ISO-8859-1: è -> \xE8 中的所有字符都由一个字节表示,并且因为序列ISO-8859-1代表两个字节,这意味着任何\xC3\xA8设备将把该序列解释为字符{ {1}},即ISO-8859-1,后跟字符\xC3,即Ã

不幸的是,您在数据库中插入的字符串是在\xA8中编码的。因此,您应该首先将数据库的编码指定为¨;或者您应该将字符串从UTF-8转换为UTF-8,然后再将它们插入数据库中:

UTF-8