无法识别数据库中的Unicode字符

all*_*lar 2 ruby mysql unicode ruby-on-rails ruby-on-rails-3

这让我很难过.我正在将一个相当大的应用程序(对我而言)从Rails 2.3升级到Rails 3.0.我也在Ruby 1.9.2中运行这个应用程序而不是之前的1.8.7.最重要的是,我也转而使用HTML5.因此,有很多变数在起作用.

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

虽然旧网站上的一切看起来都很棒,但现在我得到了一些垃圾字符,例如Ǩ而不是欧元符号或以下内容:

‡§?‡§?‡•燧µ‡§Æ‡•ç ‡§Æ‡§Ç‡§ó‡§?‡§Æ‡•ç
Run Code Online (Sandbox Code Playgroud)

...而不是梵语文本.

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

是什么赋予了?

编辑1跟随Roland的帮助:

这是我在我的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/ |
+--------------------------+----------------------------+
Run Code Online (Sandbox Code Playgroud)

但这是我在本地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/ |
+--------------------------+------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

第二个列表对我来说看起来更好(谁不太了解编码).

我应该修改服务器数据库的设置吗?这不会搞乱他们现有的数据吗?如果是这样,我该如何改变char.设置变量?

Rol*_*lig 5

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

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

$ echo '‡§?‡§?‡•燧µ‡§Æ‡•ç ‡§Æ‡§Ç‡§ó‡§?‡§Æ‡•ç' > in
$ iconv -f UTF-8 -t MacRoman < in
?????? ??????
Run Code Online (Sandbox Code Playgroud)

所以某处,对数据进行了相反的转换.字节流被解释为在MacRoman中,然后再次转换为UTF-8.

  • 我认为你必须从数据库到呈现的HTML页面一直遵循你的梵语字符串.注意任何将字符串从本机编码(你真的在Mac上,是吗?)转换为UTF-8的代码. (2认同)