Punycodeのソースを表示
←
Punycode
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
{{Table Unicode}} {{lang|en|'''Punycode'''}}(ピュニコード、プニコード)とは、[[国際化ドメイン名]]で使われる[[文字]][[符号化方式]]で、{{IETF RFC|3492}} で定義されている。{{lang|en|[[Unicode]]}} で書かれた文字列を[[Domain Name System|DNS]]で使用可能な、アルファベット(大文字小文字を区別しない)、数字、ハイフンのみの文字列に変換する。 ==概要== ドメイン名として {{lang|en|Punycode}} を使用する際は、ピリオド(<code>.</code>)で区切られたドメイン名の階層レベルごとにプレフィックスとして「<code>xn--</code>」を使用し、エンコードされた文字列を続ける。大文字と小文字は区別されない。 {|class=wikitable !可読なドメイン名!!{{lang|en|Punycode}}でのドメイン名 |- |<code>ドメイン名例.jp</code>||<code>xn--eckwd4c7cu47r2wf.jp</code> |- |<code>ウィキペディア.ドメイン名例.jp</code>||<code>xn--cckbak0byl6e.xn--eckwd4c7cu47r2wf.jp</code> |- |<code>可愛いね.そうでもないよ</code>||<code>xn--n8j5d625jn9k.xn--n8jd2ewbp7lub </code> |} ==エンコーディング手順== この節では、 {{lang|en|Punycode}} のエンコーディング手順を、「{{lang|de|bücher}}」<ref>[[ドイツ語]]で「書籍」 (複数形) を意味する。</ref>がどのようにして「<code>bcher-kva</code>」と変換されるかを例にとって、説明する。 ==={{lang|en|ASCII}}文字の分離 === 最初に、入力文字列中にあるすべてのASCII文字を残し、ASCII文字以外の文字を取り去る。また、ASCII文字以外の文字がある場合は、最後に区切り文字(ハイフン、 <code>-</code>)を追加する。 {|class=wikitable !入力文字列!!処理後 |- |<code>bücher</code>||<code>bcher-</code> |- |<code>日本Japan</code>||<code>Japan-</code> |- |<code>MajiでKoiする5秒前</code>||<code>MajiKoi5-</code> |} === 非{{lang|en|ASCII}}文字の挿入をコード番号としてエンコード === 次のエンコーディング手順を理解するために、先にデコーダの動作を理解する必要がある。 デコーダは、2つの状態変数 ''i'' と ''n'' を持つ[[有限オートマトン|オートマトン]]である。 ''i'' は分離した後のASCII文字列への挿入位置を表し、その範囲は0 (文字列の先頭への挿入を表す) からASCII文字列の長さ (文字列の末尾への挿入を表す) である。従って、この例では0–5となる。''n''は挿入する文字のコードポイントである。 {| class="wikitable" ! 分離後文字列 | || b || || c || || h || || e || || r || |- ! 挿入位置''i'' | 0 || || 1 || || 2 || || 3 || || 4 || || 5 |} ''i'' は0から始まり、''n'' は128 (非ASCII文字の最初のコードポイント) から始まる。状態遷移は[[単調関数|単調]]であり、遷移すると ''i'' が1だけ増加する。ただし ''i'' がすでに最大値の場合は ''n'' が1増加し、''i'' は0に戻る。つまり、挿入するべき箇所がなくなると、挿入すべき文字が1つ後の物となる。要するに、各状態遷移の際、''n''で表されるコードポイントを文字列に挿入するか、挿入をスキップするか、という動きとなる。 コード番号は、エンコーダによって生成される数値であり、デコーダが文字を挿入する前にスキップすべき挿入可能位置がいくつあるかを数値化したものである。"ü" のUnicodeコードポイントはU+00FC, 10進数で表すと252である。よって、ü の字を文字列の1文字目の後ろに挿入するには、ü より前にある124 (251 - 127 = 124) 種類の非ASCII文字が、"bcher" の中に6か所ある挿入ポイントに挿入されるのをスキップし、さらに0文字目 (つまり文字列の先頭) にüが挿入されるのをスキップする必要がある。したがって、デコーダには必要な1文字を挿入するために、(124 × 6) + 1 = 745回の非ASCII文字挿入をスキップするようデコーダに伝える必要がある。 === コード番号をASCII文字列として再変換 === Punycode は、このコード番号を表すために[[エンディアン|リトルエンディアン]]の[[一般化可変長整数]]を使用する。例として、コード番号745を「<code>kva</code>」と表す方法を示す。 一般化可変長整数では、各々の桁に異なる[[閾値]]を設け、これより小さい数字の表れる桁を最大桁とすることで、数字列の区切りを決める。 Punycode で用いられるリトルエンディアンの場合、小さい桁から表記されるため、[[先読み]]なしで任意の桁数の数字を表記できる。 Punycode の場合は、各桁に使える数字として36種の文字を使用する。アルファベット(大文字小文字を区別しない)の'<code>a</code>'から'<code>z</code>'が0から25を表し、数字の'<code>0</code>'から'<code>9</code>'が26から35を表す (このため、後述する式に出てくる底 (base) は、36となる)。 {| class="wikitable" ! 10進数 | 0 || 1 || 2 || 3 || … || 24 || 25 || 26 || … || 34 || 35 |- ! 一般化可変長整数 | a || b || c || d || … || y || z || 0 || … || 8 || 9 |} したがって、「<code>kva</code>」は「10 21 0」を表す。ここで閾値は (1 1 26) であるとする。最初の桁 ('''<code>k</code>'''つまり'''10''') の重みは1である。1桁目は1–35までの範囲の値をとるため、2桁目 ('''<code>v</code>'''つまり'''21''') の重みは35となる。2桁目は同様に1–35の範囲の値をとるため、3桁目 ('''<code>a</code>'''つまり'''0''') の重みは 35<sup>2</sup> = 1225 である。また、3桁目の値'''0'''は3桁目の閾値'''26'''よりも小さいため、ここで1つ目の数字列は終了であることがわかる。したがって「<code>kva</code>」は 10 × 1 + 21 × 35 + 0 × 1225 = 745 を表していることがわかる。 各桁の重み''w''(''j'')および閾値''t''(''j'')の値は、以下の式で計算される<ref>{{Cite rfc |rfc=3492 |title=IDNA Punycode |sectionname=Generalized variable-length integers |section-url=https://datatracker.ietf.org/doc/html/rfc3492#section-3.3}}</ref>: : <math>w(0) = 1</math> : <math>w(j) = w(j-1) \times ( \mathit{base} - t(j-1) )</math> : <math>t(j) = \mathit{base} \times ( j + 1 ) - \mathit{bias}</math> ::(ただし''t''(''j'')は上式を''t<sub>min</sub>''以下なら''t<sub>min</sub>''、''t<sub>max</sub>''以上なら''t<sub>max</sub>''と[[クランプ]]したものである。 ''bias'' は状態変数である。) : ''base'' = 36, ''t<sub>min</sub>'' = 1, ''t<sub>max</sub>'' = 26 2つ目の文字を挿入する際には、さらにエンコードされたコード番号を繋げていけばよいが、挿入のたびにbiasの値が調節され、各桁の閾値と重みが変わることに注意する必要がある。biasの値が変わらない範囲であれば、単純に追加するだけでよい。例えば、"bücher" に2つ目の非ASCII文字を挿入しようとすると、前述のとおりデコーダは前に戻れないため、最初の挿入結果は "büücher" で、コードは "<code>bcher-kvaa</code>" となる。次の挿入可能位置は "bücüher" で "<code>bcher-kvab</code>" となる。同様に、続きの "bücherü" は "<code>bcher-kvae</code>" となり、次に来るのは "ýbücher" で "<code>bcher-kvaf</code>" である。 ==脚注== <references /> == 関連項目 == *[[国際化ドメイン名]] *{{仮リンク|Nameprep|en|Nameprep}} == 外部サイト == * {{IETF RFC|3492}} * [https://www.motobit.com/util/punycode-decoder-encoder.asp Online Punycode/IDN Decoder/Encoder] * [https://www.gnu.org/software/libidn/GNU IDN Library—Libidn] * [http://demo.icu-project.org/icu-bin/idnbrowser ICU IDNA Demonstration] An online demonstration of how [[International Components for Unicode|ICU]] performs IDN operations * [http://punycode.bluerider.com/idn/ Punycode for Domains] Convert Unicode to Punycode * [https://www.mozilla.org/en-US/about/governance/policies/security-group/tld-idn/ List of TLDs considered by the Mozilla developers to have an effective anti-spoofing policy for name registration] * [https://punycode.jp/ 日本語JPドメイン名のPunycode変換・逆変換 - 日本語.jp] * [https://www.punycoder.com/ Punycoder - the Punycode converter (IDN converter) 🔧] {{Computer-stub}} {{grammatology-stub}} {{DEFAULTSORT:ひゆにこおと}} [[Category:Unicode]] [[Category:国際化ドメイン名]] [[Category:RFC|3492]]
このページで使用されているテンプレート:
テンプレート:Cite rfc
(
ソースを閲覧
)
テンプレート:Computer-stub
(
ソースを閲覧
)
テンプレート:Grammatology-stub
(
ソースを閲覧
)
テンプレート:IETF RFC
(
ソースを閲覧
)
テンプレート:Lang
(
ソースを閲覧
)
テンプレート:Table Unicode
(
ソースを閲覧
)
テンプレート:仮リンク
(
ソースを閲覧
)
Punycode
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報