1

我有一个使用 Postgres 的 Rails 应用程序。我有一个Document具有name属性的模型。某些名称包含重音字符。几个示例名称:

Condições Para Aplicação Da Lei

考虑一下Introdutórias

我正在使用以下方法查询具有特定名称的模型:

document = Document.where(name: "Example Document Name").first

只要名称不包含特殊字符,就可以正常工作,但是只要我使用包含任何重音字符的名称,查询就会返回 nil。

$ Document.all
$ #<Document id: 1, name: "Foo" ... >
$ #<Document id: 1, name: "Considerações Introdutórias" ... >
$ Document.where(name: "Foo").first
$ #<Document id: 1, name: "Foo" ... > 
$ Document.where(name: "Considerações Introdutórias").first
$ # nil

当名称包含特殊字符时,为什么此查询会失败?

在我的config/application.rb

config.encoding = "utf-8"

在我的 `config/database.yml' 中:

encoding: utf8
4

2 回答 2

1

检查您的 utf 配置。 config.encoding = "utf-8"

在 database.yml 中检查encoding: utf8.

看到这些问题

在所有文件中添加“#coding:utf-8”

为 ruby​​ 1.9 设置全局默认编码

于 2013-09-18T13:11:27.003 回答
1

原来问题不在于 Rails,而在于 OSX。相同的字符有不同的表示方式;可以作为单个符号,也可以分解为多个组件。两个版本在终端中显示相同,但​​将名称复制到纯文本文件中,您将看到不同之处:

组成:

Considerações Introdutórias

分解(我只能通过在分解字符周围添加空格来显示分解后的版本)

Condic ̧ o ̃ es Para Aplicac ̧ a ̃ o Da Lei

为了解决不匹配问题,我在将文件名添加到数据库之前使用Unicode Utils来编写文件名,然后再使用它们进行搜索:

require "unicode_utils/nfc"

...

filename = UnicodeUtils.nfc(filename)
于 2013-09-19T08:39:13.557 回答