Ruby on rails 在Rails 2.0/ruby 1.8.6中,如何在字符串数组中找到非ascii字符串?

Ruby on rails 在Rails 2.0/ruby 1.8.6中,如何在字符串数组中找到非ascii字符串?,ruby-on-rails,ruby,string,encoding,Ruby On Rails,Ruby,String,Encoding,我有一个从数据库加载的用户登录名数组。什么是只保留包含非ascii字符的登录名的最简单有效的方法 logins = Users.find(:all).map{|user|user.login} logins_with_non_ascii_characters = logins.select{ |login| ...??? } 谢谢 编辑:如果您有一个SQL解决方案(我使用MySQL,但是一个通用的解决方案会更好),在第一行直接过滤掉登录名,使用:conditions子句,我也同意。事实上,这将

我有一个从数据库加载的用户登录名数组。什么是只保留包含非ascii字符的登录名的最简单有效的方法

logins = Users.find(:all).map{|user|user.login}
logins_with_non_ascii_characters = logins.select{ |login| ...??? }
谢谢

编辑:如果您有一个SQL解决方案(我使用MySQL,但是一个通用的解决方案会更好),在第一行直接过滤掉登录名,使用:conditions子句,我也同意。事实上,这将更有效率:

logins = Users.find(:all, :conditions => "...???").map{|user|user.login}

到目前为止,我所发现的是:

def is_ascii(str)
    str.each_byte {|c| return false if c>=128}
    true
end

logins = Users.find(:all).map{|user|user.login}
logins_with_non_ascii_characters = logins.select{ |login| not is_ascii(login) }

这有点令人失望,而且肯定没有效率。有谁有更好的主意吗?

你可以滥用Ruby内置的正则表达式字符类来实现这一点

[:print:]包含所有ASCII可打印字符。它不包含像哔哔声这样的ASCII字符,更重要的是,它不包含多字节字符

假设用户的密码中不太可能包含ASCII BEEP字符

#reject if has non-ascii character
valid_users = users.reject! {|user| user.login =~ /[^[:print:]]/} 

应该为您这样做。

您只能从用户中选择登录列:

non_ascii = /[\u0080-\uffff]/
logins = Users.select(:login).find_all {|login| login =~ non_ascii }

或者您可以在Ruby 2.0中使用
/\p{ASCII}/
,它必须是高效的吗?听起来这是一次性的操作。@John:说得好,不一定要有效率。我只是更喜欢高效的解决方案,我相信这会帮助我更好地理解Ruby。但在本例中,此解决方案运行良好。顺便说一句,您可以生成如下可打印ASCII字符列表
(32..127).map(&:chr).join