gpt4 book ai didi

mysql - Ruby 1.9、MySQL 字符编码问题

转载 作者:行者123 更新时间:2023-11-29 14:39:06 25 4
gpt4 key购买 nike

我们的 Rails 3 应用程序需要能够接受 ä 和 こ 等外来字符,并将它们保存到我们的 MySQL 数据库中,该数据库的字符集为“utf8”。

我们的一个模型运行验证,用于在保存之前删除其名称中的所有非单词字符。在 Ruby 1.8.7 和 Rails 2 中,以下内容就足够了:

def strip_non_words(string)
string.gsub!(/\W/,'')
end

这去除了坏字符,但保留了“ä”、“こ”和“3”等内容。然而,对于 Ruby 1.9 的新编码,该语句不再起作用 - 它现在删除了这些字符以及我们不需要的其他字符。我正在尝试找到一种方法来做到这一点。

将 gsub 更改为如下所示:

def strip_non_words(string)
string.gsub!(/[[:punct]]/,'')
end

让字符串顺利通过,但数据库会出现以下错误:

Mysql2::Error: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation

通过 Iconv 运行字符串来尝试转换它,如下所示:

def strip_non_words(string)
Iconv.conv('LATIN1', 'UTF8', string)
string.gsub!(/[[:punct]]/,'')
end

导致这个错误:

Iconv::IllegalSequence: "こäè" # "こäè" being a test string

我基本上已经束手无策了。有谁知道有什么方法可以做我需要的事情吗?

最佳答案

这最终成为一个有趣的修复。

我发现 Ruby 有一个我可以使用的正则表达式,但仅限于 ASCII 字符串。因此,我必须将字符串转换为 ASCII,运行正则表达式,然后将其转换回来以提交到数据库。最终结果如下所示:

def strip_non_words(string)
string_encoded = string.force_encoding(Encoding::ASCII_8BIT)
string_encoded.gsub!(/\p{Word}+/, '') # non-word characters
string_reencoded = string_encoded.force_encoding('ISO-8859-1')
string_reencoded #return
end

事实证明,由于 Ruby 处理更改字符编码的方式,您必须单独编码:http://ablogaboutcode.com/2011/03/08/rails-3-patch-encoding-bug-while-action-caching-with-memcachestore/

关于mysql - Ruby 1.9、MySQL 字符编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8359440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com