3

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

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

HTML4仕様はRFC3986を参照しており、ホスト部分ではASCII英数字とダッシュのみを許可し、他の部分ではすべての非ASCII文字をパーセントエンコードする必要があります。これは、すべてのブラウザーでリンクが正しく機能するようにするために、href属性に入れたいものです。IDNはPunycodeでエンコードする必要があります。

HTML5ドラフトはRFC3987を参照しており、ホスト部分でパーセントエンコードされた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リクエストでhttp://сайт.рф/使用します)。Host: xn--80aswg.xn--p1ai

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

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

4

1 に答える 1

2

私があなたを正しく理解していれば、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/

あなたが望むもののように見えます。あなたがどのような特別な場合を意味するのかわかりません-おそらくあなたが言及している落とし穴のいくつかの例を与えることができますか?

更新:覚えたばかりですが、Werkzeugにはバージョン0.6以降の機能がiri_to_uriありuri_to_iriます(リンクはドキュメントの関連部分にあります)。

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

于 2010-05-14T15:31:16.993 に答える