人間が読み取り可能な IRI を有効な URI にエンコード/デコードするための IDN 対応ツール [終了]

StackOverflow https://stackoverflow.com/questions/2833013

質問

ユーザーが何らかのリソースのアドレスを入力し、それを次のように変換する必要があると仮定します。

<a href="valid URI here">human readable form</a>

HTML4仕様とは、 RFC 3986 これにより、ホスト部分では ASCII 英数字とダッシュのみが許可され、他の部分の非 ASCII 文字はすべてパーセント エンコードされる必要があります。これは、リンクがすべてのブラウザで適切に機能するようにするために href 属性に入れたいものです。IDN は次のようにエンコードする必要があります ピュニコード.

HTML5 ドラフトは次のことを指します RFC 3987 これにより、ホスト部分でパーセント エンコードされた Unicode 文字が許可され、エンコードせずにホスト部分と他の部分の両方で Unicode の大規模なサブセットが許可されます。ユーザーはこれらのフォームのいずれかに住所を入力できます。人間が読める形式で提供するには、すべての印刷可能な文字をデコードする必要があります。通常、ターゲット サイトで他の文字エンコーディングが使用されている場合、アドレスの一部の部分が有効な UTF-8 シーケンスに対応しない可能性があることに注意してください。

取得したいものの例:

<a href="http://xn--80aswg.xn--p1ai/%D0%BF%D1%83%D1%82%D1%8C?%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81">
http://сайт.рф/путь?запрос</a>

これらのタスクを解決するツールはありますか?私は特に Python と JavaScript のライブラリに興味があります。

アップデート:Python と JavaScript でパーセントと Punycode (適切な正規化なしでも問題ありません) のエンコード/デコードを行う方法があることは知っています。タスク全体にはさらに多くの作業が必要であり、いくつかの落とし穴があります (一部の文字は、コンテキストに応じて常にエンコードする必要があるか、まったくエンコードしない必要があります)。すぐに使用できるライブラリがあるかどうか疑問に思います。 全体 問題は、これは非常に一般的であるようで、最新のブラウザではすでにそのような変換が行われているためです (次のように入力してみてください) http://%D1%81%D0%B0%D0%B9%D1%82.%D1%80%D1%84/ Google Chrome では、次のように置き換えられます。 http://сайт.рф/, 、ただし使用します Host: xn--80aswg.xn--p1ai HTTPリクエスト内)。

アップデート2:Vinay Sajip 氏は、Werkzeug にはほとんどの場合を正しく処理する iri_to_uri 関数と uri_to_iri 関数があると指摘しました。これまでのところ、失敗するケースは 2 つだけ見つかりました。パーセントでエンコードされたホスト (修正は非常に簡単です) と無効な utf-8 シーケンス (うまく行うのは少し難しいですが、問題にはなりません)。

JavaScriptのライブラリを探しています。書くのは難しくありませんが、車輪の発明は避けたいと思います。

役に立ちましたか?

解決

私の理解が正しければ、Python に含まれるバッテリーを使用できます。

# -*- coding: utf-8 -*-

import urllib
import urlparse

URL1 = u'http://сайт.рф/путь?запрос'
URL2 = 'http://%D1%81%D0%B0%D0%B9%D1%82.%D1%80%D1%84/'

def to_idn(url):
    parts = list(urlparse.urlparse(url))
    parts[1] = parts[1].encode('idna')
    parts[2:] = [urllib.quote(s.encode('utf-8')) for s in parts[2:]]
    return urlparse.urlunparse(parts)

def from_idn(url):
    return urllib.unquote(url)

print to_idn(URL1)
print from_idn(URL2)
print to_idn(from_idn(URL2).decode('utf-8'))

印刷するもの

http://xn--80aswg.xn--p1ai/%D0%BF%D1%83%D1%82%D1%8C?%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81
http://сайт.рф/
http://xn--80aswg.xn--p1ai/

それはあなたが望むもののように見えます。特殊なケースがどのようなことを指しているのかわかりませんが、あなたが言及している落とし穴の例をいくつか挙げていただけますか。

アップデート: 今思い出したんだけど、ヴェルクツォウクには iri_to_uri そして uri_to_iri バージョン 0.6 以降の機能 (リンクはドキュメントの関連部分へのリンクです)。

さらに更新: 申し訳ありませんが、Python の実装だけでなく JavaScript の実装も探していることに気づきませんでした。Punycode の既存のパブリック ドメイン Javascript 実装は次のとおりです。 ここ. 。ただし、それを保証することはできません。もちろん、組み込みの JavaScript も使用できます encodeURI/decodeURI API。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top