โมดูลการเรียนรู้แบบไมโครด้าน Universal Acceptance โมดูลการเรียนรู้ที่ 6: การพัฒนาโปรแกรมที่รองรับชื่อโดเมนสากล ภายใต้แนวคิด Universal Acceptance (UA)

ข้อจำกัดด้านการรองรับชุดอักขระของ IDNA2003

เพื่อให้เห็นความแตกต่างด้านการรองรับชุดอักขระระหว่างไลบรารีตามมาตรฐาน IDNA2003 และ IDNA2008 ตัวอย่างโค้ดด้านล่างใช้ชื่อโดเมนแบบยูนิโค้ด “straße.co.th” ซึ่งมีอักขระ ‘ß’ เป็นส่วนประกอบ ในขณะที่มาตรฐาน IDNA2008 สามารถจัดการกับอักขระดังกล่าวได้อย่างถูกต้องและราบรื่น ไลบรารีที่อ้างอิงตามมาตรฐาน IDNA2003 อาจประสบปัญหาในการประมวลผล ส่งผลให้เกิดข้อผิดพลาดประเภท UnicodeError หรือเกิดการแทนที่อักขระโดยไม่แสดงข้อผิดพลาดอย่างชัดเจน เมื่อรันตัวอย่างโค้ด ผู้เรียนจะสามารถสังเกตเห็นได้ว่า IDNA2008 จัดการกระบวนการแปลงชื่อโดเมนได้อย่างถูกต้อง แสดงให้เห็นถึงประสิทธิภาพและความสามารถที่เหนือกว่าของมาตรฐาน IDNA2008 เมื่อเทียบกับ IDNA2003 ในการรองรับอักขระที่หลากหลายมากยิ่งขึ้น

ตัวอย่างที่  4: การอธิบายข้อบกพร่องของไลบรารี IDNA2003 โดยใช้ภาษา Python เป็นตัวอย่าง

from idna import encode, decode

import encodings.idna

 

def idna2003_support():

        unicode_domain_name = “straße.co.th

         try:

        # Convert Unicode domain name to Punycode using IDNA2003

         punycode_domain_name_idna2003 =             encodings.idna.ToASCII(unicode_domain_name)

print(“Punycode domain name (IDNA2003):”,                 punycode_domain_name_idna2003)

         # Attempt to convert Punycode domain name back to Unicode using IDNA2003

         decoded_domain_name_idna2003 =   encodings.idna.ToUnicode(punycode_domain_name_idna2003)

         print(“Decoded domain name (IDNA2003):”,   decoded_domain_name_idna2003)

     except UnicodeError as e:

        print(“Error (IDNA2003):”, str(e))

 

def idna2008_support():

    unicode_domain_name = “straße.co.th

 

    try:

        # Convert Unicode domain name to Punycode using IDNA2008

        punycode_domain_name_idna2008 = encode(unicode_domain_name)

        print(“Punycode domain name (IDNA2008):”, punycode_domain_name_idna2008)

 

        # Attempt to convert Punycode domain name back to Unicode using IDNA2008

        decoded_domain_name_idna2008 = decode(punycode_domain_name_idna2008)

        print(“Decoded domain name (IDNA2008):”, decoded_domain_name_idna2008)

    except UnicodeError as e:

        print(“Error (IDNA2008):”, str(e))

 

if __name__ == “__main__”:

    print(“Demonstrating IDNA2003 Support:”)

    idna2003_support()

    print(“\nDemonstrating IDNA2008 Support:”)

    idna2008_support()

ตัวอย่างที่ 5: การอธิบายข้อบกพร่องของไลบรารี IDNA2003 โดยใช้ภาษา Java เป็นตัวอย่าง

import java.net.IDN;

import com.ibm.icu.text.IDNA;

 

public class IDNACharacterSet {

 

    public static void idna2003Support() {

        String unicodeDomainName = “straße.co.th“;

        try {

            // Convert Unicode domain name to Punycode using IDNA2003

            String punycodeDomainNameIDNA2003 = IDN.toASCII(unicodeDomainName);

            System.out.println(“Punycode domain name (IDNA2003): ” + punycodeDomainNameIDNA2003);

            // Attempt to convert Punycode domain name back to Unicode using IDNA2003

            String decodedDomainNameIDNA2003 = IDN.toUnicode(punycodeDomainNameIDNA2003);

            System.out.println(“Decoded domain name (IDNA2003): ” + decodedDomainNameIDNA2003);

        } catch (IllegalArgumentException e) {

            System.out.println(“Error (IDNA2003): ” + e.getMessage());

        }

    }

 

    public static void idna2008Support() {

        String unicodeDomainName = “straße.co.th“;

        try {

            // Convert Unicode domain name to Punycode using IDNA2008

            String punycodeDomainNameIDNA2008 = IDNA.convertIDNToASCII(unicodeDomainName, 0);

            System.out.println(“Punycode domain name (IDNA2008): ” + punycodeDomainNameIDNA2008);

            // Attempt to convert Punycode domain name back to Unicode using IDNA2008

            String decodedDomainNameIDNA2008 = IDNA.convertToUnicode(punycodeDomainNameIDNA2008, 0);

            System.out.println(“Decoded domain name (IDNA2008): ” + decodedDomainNameIDNA2008);

        } catch (IllegalArgumentException e) {

            System.out.println(“Error (IDNA2008): ” + e.getMessage());

        }

    }

 

    public static void main(String[] args) {

        System.out.println(“Demonstrating IDNA2003 Support:”);

        idna2003Support();

        System.out.println(“\nDemonstrating IDNA2008 Support:”);

        idna2008Support();

    }

}

 

ผลลัพธ์ (Output): ตัวอย่างโค้ดทั้งในภาษา Python และภาษา Java ที่แสดงไว้ข้างต้น จะให้ผลลัพธ์ดังต่อไปนี้

  Demonstrating IDNA2003 Support:

  Punycode domain name (IDNA2003): ‘strasse.co.th’

  Decoded domain name (IDNA2003): strasse.co.th

 

  Demonstrating IDNA2008 Support:

  Punycode domain name (IDNA2008): ‘xn--strae-oqa.co.th’

  Decoded domain name (IDNA2008): straße.co.th

ประเด็นสำคัญคือ มาตรฐาน IDNA2003 มีข้อจำกัดในการรองรับชุดอักขระบางประเภท และอาจไม่สามารถแปลงอักขระยูนิโค้ดทั้งหมดให้อยู่ในรูปแบบ Punycode ได้อย่างถูกต้อง ซึ่งข้อจำกัดดังกล่าวเป็นหนึ่งในประเด็นที่มาตรฐาน IDNA2008 ได้เข้ามาแก้ไขและปรับปรุงให้มีความสมบูรณ์ยิ่งขึ้น