2011-09-05 24 views
2

这让我难过。我正在将一个相当大的应用程序(对我来说)从Rails 2.3升级到Rails 3.0。我也在Ruby 1.9.2中运行这个应用程序,而不是之前的1.8.7。最重要的是,我也切换到了HTML5。因此存在很多变数。来自数据库的Unicode字符未被识别

在几页中,来自MySQL数据库的文本不再显示正确。这可以像欧元符号一样简单(欧元符号),也可以像一些梵文文本一样简单:सर्वम्मंगलम्

虽然现在的一切都很棒,但现在我得到了一些垃圾字符,例如Ǩ而不是欧元符号或以下:

सर्वम् मंगलम् 

...而不是梵文文本。

数据库中的数据保持不变。据我所知,到处都是为utf-8设置的。

什么给?

编辑1跟进罗兰的帮助:

这里是我得到我的Ubuntu的服务器的MySQL数据库:

mysql> SHOW VARIABLES LIKE 'character_set%'; 
+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | latin1      | 
| character_set_connection | latin1      | 
| character_set_database | latin1      | 
| character_set_filesystem | binary      | 
| character_set_results | latin1      | 
| character_set_server  | latin1      | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 

但这里是我从我的本地Mac上运行的命令得到:

mysql> SHOW VARIABLES LIKE 'character_set%'; 
+--------------------------+------------------------------------------------------+ 
| Variable_name   | Value            | 
+--------------------------+------------------------------------------------------+ 
| character_set_client  | utf8             | 
| character_set_connection | utf8             | 
| character_set_database | utf8             | 
| character_set_filesystem | binary            | 
| character_set_results | utf8             | 
| character_set_server  | utf8             | 
| character_set_system  | utf8             | 
| character_sets_dir  | /usr/local/Cellar/mysql/5.5.14/share/mysql/charsets/ | 
+--------------------------+------------------------------------------------------+ 

第二上市看起来更好看(我不太了解编码)。

我应该修改我的服务器数据库的设置吗?这不会搞乱他们现有的数据吗?如果是的话,我怎么去改变字符。设置变量?

回答

5

当您将给定的字符串解释为Unicode时,将其保存为UTF-8为字节流,然后将字节流转换为MacRoman,您将获得正确的字节。这些是UTF-8编码的字符串。

我这样做(在UTF-8终端):

$ echo 'सर्वम् मंगलम्' > in 
$ iconv -f UTF-8 -t MacRoman < in 
सर्वम् मंगलम् 

所以某处,相反的转换完成的数据。字节流被解释为MacRoman,然后再次转换为UTF-8。

+1

不错,赶上。出于兴趣,你是如何计算出糟糕的编码是MacRoman的? (经验猜测,尝试每种编码,你可以想到?) –

+0

哦,并开始检查不匹配的编码的好地方是:你的HTTP头来回和Web服务器,你的MySQL表设置,也许你的MySQL客户端库设置红宝石。 –

+1

MacRoman是我的第一个猜测。它不能是ISO-8859-1,因为我知道典型的编码错误是怎么样的。它们通常包含一个“Ô作为第一个“错误的字符”,或ISO-8859-1中的其他字符,而且我知道编码非常重要。你的例子中的每个第三个字符都是相同的这一事实是与UTF-8相关的一个重要提示。剩下的就是纯粹的运气。 –