2010-07-12 5 views
3

Je dois prendre en charge les noms de domaine internationalisés dans une application que j'écris. Plus précisément, j'ai besoin de ACE coder les noms de domaine avant de les transmettre à une API externe.Ruby - noms de domaine internationalisés

La meilleure façon de faire cela semble être en utilisant libidn. Cependant, j'ai des problèmes pour l'installer sur ma machine de développement (Windows 7, ruby ​​1.8.6), car elle se plaint de ne pas avoir trouvé la bibliothèque GNU IDN (que j'ai installée, et aussi fourni le chemin complet).

Donc, fondamentalement, j'envisage deux choses:

  1. Rechercher sur le Web un petit bijou préconstruits win32 libidn (sans résultat jusqu'à présent)

  2. Trouver une autre (espérons-pure) bibliothèque rubis qui peut faire la même chose (pas trouvé de manière apparente car je pose cette question ici)

Alors, est-ce que quelqu'un d'entre vous a eu libidn pour travailler sous Windows? Ou avez-vous utilisé un autre extrait de bibliothèque/code capable de coder des noms de domaine?

Répondre

3

Grâce à this snippet, j'ai finalement trouvé une solution qui n'exigeait pas libidn. Il est construit sur punicode4r avec soit le gem unicode (un binaire pré-construit peut être trouvé here), ou avec ActiveSupport. Je vais utiliser ActiveSupport puisque j'utilise Rails de toute façon, mais pour référence, j'inclus les deux méthodes.

Avec le unicode bijou:

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 

Avec 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 

La solution ActiveSupport a été trouvé grâce à this question StackOverflow.

+0

Pour ce que ça vaut, le module punycode est disponible sous forme de gemme, dans un gemfile: 'gem 'punycode4r', require: 'punycode' # internationalisation des noms de domaine' – phillbaker

Questions connexes