Ruby on Rails 4,不兼容的字符编码:拉丁语1



我在 rails 4 的 Web 应用程序中遇到字符集编码/解码问题。我在网页中看到"rappresent"或"Ã ̈"这样的词,但我想看到"rappresentò"和"è"。

这是我的堆栈结构:

服务器操作系统 : Ubuntu 14.04,MySQL数据库 : "foo" ,表:"酒吧"

表说明 :|描述|中文本|latin1_swedish_ci |是的 |....

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

默认: &默认适配器: MySQL2 编码:  拉丁语1  池: 5 用户名: 根密码: **** 套接字: ....

在轨道视图中

元字符集是"ISO-8859-1"

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

这是我在 rails 控制台中的输出:

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

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

xC3  --> Ã
xA8  --> ¨

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

UTF-8中,序列xC3xA8恰好代表一个字符:è。 因此,这意味着您在数据库中插入了 UTF-8 序列xC3xA8以进行è --而不是用于èISO-8859-1 序列,这是 xE8

UTF-8:       è  ->  xC3xA8
ISO-8859-1:  è  ->  xE8

因为ISO-8859-1中的所有字符都由一个字节表示,并且因为序列xC3xA8表示两个字节,这意味着任何ISO-8859-1设备都将将该序列解释为字符xC3,即Ã,后跟字符xA8,即¨

遗憾的是,您插入到数据库中的字符串是用 UTF-8 编码的。 因此,您应该将数据库的编码指定为UTF-8开头;或者,在将字符串插入数据库之前,您应该已将字符串从 UTF-8 转换为 ISO-8859-1

2.0.0-p481 :029 > str = "RxC3xA8"
 => "Rè"    #Terminal set to 'ISO-8859-1' encoding
2.0.0-p481 :030 > str.encoding
 => #<Encoding:UTF-8> 
2.0.0-p481 :031 > str = str.encode('ISO-8859-1', 'UTF-8')
 => "RxE8" 
2.0.0-p481 :032 > str.encoding
 => #<Encoding:ISO-8859-1> 
2.0.0-p481 :033 > puts str
Rè
 => nil 

最新更新