我在 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