この記事では、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関数IdnToAsciiとIdnToUnicodeがあります。 残念ながら、最小サポートクライアントは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. また、このトピックに関する興味深い追加も嬉しく思います。