Ruby - интернационализированные доменные имена - PullRequest
3 голосов
/ 12 июля 2010

Мне нужно поддерживать интернационализированные доменные имена в приложении, которое я пишу.В частности, мне нужно ACE-кодирование доменных имен, прежде чем я передам их внешнему API.

Лучший способ сделать это - использовать libidn .Однако у меня возникают проблемы при установке его на моей машине для разработки (Windows 7, ruby ​​1.8.6), поскольку он жалуется на отсутствие библиотеки GNU IDN (которую я установил, а также предоставил полный путь к ней).

Итак, в основном я рассматриваю две вещи:

  1. Поиск в Интернете готового самоцвета win32 libidn (пока что безрезультатно)

  2. Найти другое(надеюсь, чистая) библиотека ruby, которая может делать то же самое (не найдена, поскольку я задаю этот вопрос здесь)

Так кто-нибудь из вас получил libidn для работы под Windows?Или вы использовали какой-то другой фрагмент библиотеки / кода, который может кодировать доменные имена?

1 Ответ

3 голосов
/ 12 июля 2010

Благодаря этому фрагменту я наконец-то нашел решение, не требующее libidn. Он построен на punicode4r вместе с гемом unicode (готовый двоичный файл можно найти здесь ) или с ActiveSupport. Я буду использовать ActiveSupport, так как я все равно использую Rails, но для справки я включаю оба метода.

С юникодом gem:

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 было найдено благодаря этому вопросу StackOverflow.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...