2010-07-12 61 views
3

我需要在应用程序中支持国际化域名。更具体地说,我需要在将域名传递给外部API之前进行ACE编码。Ruby - 国际化域名

做到这一点的最好方法似乎是使用libidn。然而,我在将它安装到我的开发机器(Windows 7,ruby 1.8.6)时遇到问题,因为它抱怨没有找到GNU IDN库(我已经安装了它,并且还提供了完整路径)。

所以基本上我正在考虑两件事情:

  1. 搜索预建的Win32 libidn这个宝石网(至今无果而终)

  2. 查找另一(希望纯)红宝石库,可以做同样的事情(因为我在这里问这个问题没有找到出色的表现)

所以你们有没有人有libidn在Windows下工作?或者您是否使用了能够对域名进行编码的其他库/代码片段?

回答

3

感谢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的问题。

+0

对于它的价值,punycode模块可作为gem,在gemfile中使用: 'gem'punycode4r',require:'punycode'#internationalization of domain names' – phillbaker 2015-01-31 02:33:00