感谢this snippet,我终于找到了一个不需要libidn的解决方案。它构建于punicode4r以及unicode gem(预构建二进制可以找到here)或ActiveSupport。我会使用ActiveSupport,因为我使用Rails,但为了参考,我包含了两种方法。
随着的Unicode宝石:
require 'unicode'
require 'punycode' #This is not a gem, but a standalone file.
def idn_encode(domain)
parts = domain.split(".").map do |label|
encoded = Punycode.encode(Unicode::normalize_KC(Unicode::downcase(label)))
if encoded =~ /-$/ #Pure ASCII
encoded.chop!
else #Contains non-ASCII characters
"xn--" + encoded
end
end
parts.join(".")
end
随着的ActiveSupport:
require "punycode"
require "active_support"
$KCODE = "UTF-8" #Have to set this to enable mb_chars
def idn_encode(domain)
parts = domain.split(".").map do |label|
encoded = Punycode.encode(label.mb_chars.downcase.normalize(:kc))
if encoded =~ /-$/ #Pure ASCII
encoded.chop! #Remove trailing '-'
else #Contains non-ASCII characters
"xn--" + encoded
end
end
parts.join(".")
end
的的ActiveSupport溶液发现由于this StackOverflow的问题。
对于它的价值,punycode模块可作为gem,在gemfile中使用: 'gem'punycode4r',require:'punycode'#internationalization of domain names' – phillbaker 2015-01-31 02:33:00