国内ドメイン名:ASCII形式からIDNへ、およびその逆

国内ドメイン名を使用する必要がある場合、ほとんどの場合、クライアントからの「xn—abrakatabra.com」という形式で十分です。 しかし、国の表現でドメイン名を使用する必要がある場合があります。 「Example.com」。



この記事では、MS VisualStudioおよびICUライブラリーを使用して、ASCII形式からIDN(およびその逆)に国家ドメイン名をコーディングするソフトウェア実装について説明します。





物語。

略語IDNを既に聞いている場合は、次の4つの段落を安全にスキップできます。



歴史的に、ASCII文字:「Az」、「0-9」、「-」はインターネット上のドメイン名を表すために使用されていました。 インターネットの発展に伴い、シンボルが不足するようになり(より正確に短く便利な名前)、ICANNは国別アルファベット(Unicodeで表される)を使用してドメイン名の表現を拡張する必要性を発表しました。



IDN- (国際化ドメイン名)は、国のアルファベットの文字を含むドメイン名です。 たとえば、「site.com」。



いくつかのIDNフォーラムでの多くの議論は、2つの意見にまとめられています。 2番目は、このテクノロジーの実装の詳細に基づいています。



新しいキャラクターはよくコード化された古いキャラクターです:)



本質的に、IDNは長くて不快な文字セットの便利で美しいラッパーです。 クライアント側では、国別文字はドメイン名である有効なASCII文字にエンコードされます。 アドレスバーに「example。Test」と入力すると、「xn-e1afmkfd.xn-80akhbyknj4f」に変換されます。 これを行うには、ASCII互換エンコーディングファミリ(ACE)のエンコーディング-Punycodeを使用します。Punycodeは、多言語ドメインネームシステムで現在使用されています。 Punycodeコーディングアルゴリズムは非常にシンプルで、 RFC-3492に詳細に記述されています (Cでも同じ場所に実装されています)。



どのエンコーディングおよびトランスコーディング機能を使用できますか?



1. Microsoftツール。



VisualStudioでは、System.Globalization名前空間はIdnMappingクラスを実装します。これらのメソッドの中には、特にIDNA標準に従って再コーディングされるGetAsciiおよびGetUnicodeがあります。 クラスではなく、夢-どこも簡単です:



using namespace System::Globalization;

using System::String;



String^ s1 = ".";

String^ s;



IdnMapping idn;



s = idn.GetAscii(s1, 0, s1->Length);

System::Console::WriteLine(s);



String^ s2 = "xn--b1agh1afp.xn--e1afmkfd";



s = idn.GetUnicode(s2, 0, s2->Length);

System::Console::WriteLine(s);






結果:

xn-b1agh1afp.xn-e1afmkfd

こんにちは例




同じ目的で、ソフトには2つのAPI関数IdnToAsciiIdnToUnicodeがあります。 残念ながら、最小サポートクライアントはWindows Vistaです。 残念だ。 この機能の使用例は、彼らのウェブサイトにあります。



2. ICU(Unicodeの国際コンポーネント)の手段。 ICUは、Unicodeおよびグローバリゼーションのサポートと機能を実装するC / C ++およびJavaオープンソースライブラリです。 このライブラリには、次のドメイン名変換関数が実装されています。



int32_t uidna_toUnicode / uidna_toAscii (const UChar * src、int32_t srcLength、UChar * dest、int32_t destCapacity、int32_t options、UParseError * parseError、UErrorCode * status)


-ASCIIからIDN / IDNからASCIIへの単純名(ドメイン名のコンポーネント部分)の変換に使用されます。 たとえば、「www.example.com」は、「www」、「example」、「com」の3つの部分で構成されています。



int32_t uidna_IDNToUnicode / uidna_IDNToASCII (const UChar * src、int32_t srcLength、UChar * dest、int32_t destCapacity、int32_t options、UParseError * parseError、UErrorCode * status)


-完全修飾ドメイン名のASCIIからIDN / IDNからASCIIへの変換に使用されます。 たとえば、「www.example.com」。



パラメータ:

srcは、変換される入力文字列へのポインタです。

srcLength -srcの長さ。 srcがsi文字列の場合、-1を指定できます。

dest-変換された文字列が書き込まれる行へのポインタ。

destCapacity-宛先のサイズ。

オプション -オプションビット。 次の値のいずれかを取ることができます。

  • UIDNA_DEFAULT-デフォルト。 エラーの場合、U_UNASSIGNED_ERRORを返します。
  • UIDNA_ALLOW_UNASSIGNED-このフラグが設定されている場合、入力行の割り当てられていないコード要素はUnicodeエンコーディングで表示されていると見なされます。
  • UIDNA_USE_STD3_RULES —ドメイン名の構文は、STD3 ASCII標準に準拠する必要があります。 エラーの場合、U_IDNA_STD3_ASCII_RULES_ERRORを返します。


parseError -UParseError構造体へのポインター。 ゼロに設定できます。

ステータス -エラーコード。


戻り値は、変換された文字列の長さです。 オーバーフローを回避するには、destCapacityと比較してください。



#include "unicode/utypes.h"

#include "unicode/parseerr.h"

#include "unicode/uidna.h"



wchar_t* s1 = L".";

wchar_t pPunycode[MAX_PATH];

UErrorCode status = U_ZERO_ERROR;



int32_t i = uidna_IDNToASCII(s1, -1, pPunycode, MAX_PATH, UIDNA_USE_STD3_RULES, NULL, &status);



if(status == U_IDNA_STD3_ASCII_RULES_ERROR)

wprintf(L"Error");








wchar_t* s2 = L"xn--e1afmkfd.xn--e1afnjf";

wchar_t pUnicode[MAX_PATH];

UErrorCode status = U_ZERO_ERROR;



int32_t i = uidna_IDNToUnicode(s2, -1, pUnicode, MAX_PATH, UIDNA_ALLOW_UNASSIGNED, NULL, &status);



if(status == U_IDNA_STD3_ASCII_RULES_ERROR)

wprintf(L"Error")








結果は前の例と同様です。



ライブラリを使用する前に収集する必要があります。 順番に(MS VSの場合):



1.ここから最新リリース(ICU4C 4.4 2010-03-17を持っています)を選択します

2.ソートをダウンロードします。

3. PATH環境変数を設定します:“ \ bin \”

4.ソリューションを開きます:“ \ source \ allinone \ allinone.sln”

5.ビルド->バッチビルド...->すべて選択->リビルド。

6.ビルド->ソリューションのリビルド。



そうでない場合は、「\ Readme.html-> ICUをビルドおよびインストールする方法」を開いて確認します。 エラーなしで収集された場合-使用します。



追伸:私はどんなコメントや修正も喜んでいます。

Pp.s. また、このトピックに関する興味深い追加も嬉しく思います。



All Articles