【发布时间】:2014-04-28 11:18:45
【问题描述】:
我目前正在开发的应用程序具有搜索功能。在搜索特定字符串时,例如。 “4 for £3”匹配表行的特定列,搜索不会返回任何结果,尽管后端数据库已正确地将其存储为特定行的列中的值。
日志将搜索字符串作为“3 英镑的 4”传递。我不确定额外的 'Â' 字符是从哪里附加到我的搜索字符串(search_str)的。我尝试了以下解决方法来从后端搜索确切的字符串,但它似乎不起作用 -
解决方法 -
params[:search_str].include?('Â') ? params[:search_str].gsub!('£', '£') :
另外,当我在 IRB 中尝试做同样的事情时,为了获得更多信息,我得到以下信息 -
irb(main):020:0> a = "2 for £7"
=> "2 for \302\2437"
irb(main):021:0>
irb(main):013:0> a.include?('Â')
=> true
在 Rails 中执行相同的命令时,从视图文件中单击的搜索按钮调用操作时返回 false。不知道为什么会出现这种异常行为,可能是因为 Rails 将“2 英镑 7”视为“2 英镑 7”而不是“2 英镑 302\2437”?
我验证了 '\302' 和 '\243' 是 this page 中给出的八进制等效项。我也确实看过similar question,但它似乎对我的情况没有帮助。
任何关于我如何解决这个问题的建议都会非常有帮助。
[更新问题]
database.yml 是 -
development:
adapter: mysql
database: db_name
username:
password:
host: localhost
dev-rails:
adapter: mysql
database:
username:
password:
host:
port:
dev-delayedjobs:
development
test:
adapter: mysql
database: db_name
username:
password:
host:
port:
作为查询的一部分返回的结果 - show variables like 'char%';
character_set_client utf8
character_set_connection utf8
character_set_database latin1
character_set_filesystem 二进制文件
character_set_results utf8
character_set_server latin1
character_set_system utf8
character_sets_dir /app(.. 一些路径..)
谢谢。
【问题讨论】:
-
您说数据库正确存储了值,但问题出在搜索上。 “得到”呢? (
select * from MY_DB) - 那里的值正确吗? -
例如,如果我通过 mysql 工作台从 my_db 执行 sel *,它会返回正确的值。但是当我在浏览器网页中显示它时,在一个页面中它会适当地显示英镑符号,但在另一个页面中它会显示�符号而不是显示英镑符号。正确显示磅符号的位置具有以下代码和页面源 -
<td> <a href="http://url" target="_blank">2 for &#163;3</a> </td>。不能正常显示的地方有源码-<td width=150px>2 for �3</td> -
看起来您的数据库使用的是 UTF8,但 rails 使用的是 Latin1 或其他一些较小的字符集。您能否在您的问题中添加以下内容:1)进入 mysql 并输入
show variables like 'char%';2)您的config/database.yaml文件的内容(如果您使用它们,则减去密码) -
@MaxWilliams - 感谢您的评论,问题已更新。
-
您能否尝试将
encoding: utf8添加到您的config/database.yml文件中的相关部分(development或dev-rails,无论您使用的是哪个)。然后重新启动您的 Rails 服务器并再次尝试搜索。
标签: ruby-on-rails ruby encoding character-encoding pound