IDN علم أدوات ترميز/فك الإنسان للقراءة IRI من صالح URI [مغلقة]

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 في استضافة جزء كبير فرعية من يونيكود في كل من المضيف وأجزاء أخرى من دون ترميز لهم.المستخدم قد أدخل العنوان في أي من هذه الأشكال.لتوفير الإنسان شكل مقروء من ذلك أنا بحاجة إلى فك جميع القابلة للطباعة.لاحظ أن بعض أجزاء من العنوان قد لا تتوافق مع صالح 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>

هل هناك أي أدوات لحل هذه المهام ؟ انا مهتمة بصفة خاصة في مكتبات بايثون جافا سكريبت.

التحديث:وأنا أعلم أن هناك طريقة للقيام في المئة بيونيكود (بدون التطبيع ، ولكن أستطيع أن أعيش مع ذلك) الترميز/فك التشفير في بايثون جافا سكريبت.كل مهمة تحتاج إلى المزيد من العمل و هناك بعض العثرات (بعض الشخصيات يجب أن تكون دائما المشفرة أو لم ترميز حسب السياق).وأتساءل عما إذا كان هناك استعداد لاستخدام المكتبات من أجل كله مشكلة, لأنه يبدو أن شائعة جدا و المتصفحات الحديثة بالفعل هذه التحويلات (حاول كتابة http://%D1%81%D0%B0%D0%B9%D1%82.%D1%80%D1%84/ في جوجل كروم وسيتم استبداله مع http://сайт.рф/, ولكن استخدام Host: xn--80aswg.xn--p1ai في طلب HTTP).

Update2:فيني Sajip وأشار إلى أن Werkzeug وقد iri_to_uri و uri_to_iri الوظائف التي يعالج معظم الحالات بشكل صحيح.لقد وجدت 2 فقط الحالات التي فشلت حتى الآن:في المئة ترميز المضيف (من السهل جدا لإصلاح) غير صالحة utf-8 متواليات (انه صعب قليلا أن تفعل بشكل جيد, ولكن لا ينبغي أن يكون مشكلة).

أنا لا تزال تبحث عن المكتبة في جافا سكريبت.ليس من الصعب أن أكتب لكني أفضل لتجنب اختراع العجلة.

هل كانت مفيدة؟

المحلول

إذا فهمت بشكل صحيح, ثم يمكنك استخدام البطاريات المضمنة في بايثون:

# -*- 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 له iri_to_uri و uri_to_iri وظائف في الإصدارات 0.6 في وقت لاحق (الروابط إلى الجزء ذي الصلة من المستندات).

آخر تحديث: آسف, لم أكن قد لاحظت أن كنت تبحث عن سكريبت التنفيذ فضلا عن الثعبان واحد.موجود في المجال العام جافا سكريبت تنفيذ بيونيكود هو هنا.أنا لا يمكن أن يشهدوا على ذلك.وبالطبع يمكنك استخدام المدمج في جافا سكريبت encodeURI/decodeURI واجهات برمجة التطبيقات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top