jmIrc + TIS-620

โหลดตรงนี้ jmIrc

อันนี้สืบเนื่องจาก คุณ Nike ณ. MakaMusic ต้องการหา Client สำหรับเล่น IRC (ซึ่งพวกเราใช้คุยกัน) บนโทรศัพท์มือถือ ทีนี้อันเนื่องจากข้อกำหนดที่ว่า ห้องที่เราคุยกันนั้นใช้ Encoding เป็น TIS-620 (หรือ Windows-874) และ คุณ Nike ดันใช้โทรศัพท์ Samsung ที่รันบน OS ของตัวเอง (จะเรียกว่า Dump Phone หรือ Stupid Phone ก็ได้ แล้วแต่สะดวก 🙂 ) ซึ่งทางเลือกก็เหลือแต่ Client ที่เป็น J2ME เท่านั้น !!

คุณ Nike ตระเวณหา Client ฟรี มาหลายตัว แต่เนื่องด้วยความสามารถอันจำกัดของ J2ME ก็เลยไม่มีใครเขียน Client ที่มันรองรับ TIS-620 เลยสักกะตัว ส่วนใหญ่จะเป็น UTF-8 กับ Encoding ภาษายุโรปไม่กี่ตัว … ความหวังค่อนข้างเลือนลาง แต่ในที่สุดคุณ Nike ก็ลองอีกวิธี คือ เอา Client ที่เป็น Open Source เอามาให้ผมแก้โค๊ดให้มันรองรับ TIS-620 ซะเลย และนั่นก็คือ jmIrc

ผมใช้เวลาศึกษา Source Code อยู่พักนึงก็พบว่าอันที่จริงแล้วเจ้านี่ไม่ได้ใช้กลไกการ Encode/Decode ของ Java สักเท่าไหร่ (ยกเว้นถ้าตั้งเป็น UTF-8) แต่มัน Encode/Decode Stream ด้วยตัวมันเอง ก็อ่านโค๊ดต่อไปก็พบว่ามันใช้วิธีการเช็คค่า input stream ว่าถ้า byte นั้นมีค่าสูงกว่า 0x80 มันก็จะใช้ตัวอักษรใน charmap ของตัวโปรแกรมแทนที่จะดีโค๊ดด้วย UTF-8 ซึ่งก็ไม่ยากอะไรเพราะเป็นวิธีพื้นฐานสำหรับ 8-bit encoding อยู่แล้ว

ผมเพิ่มโค๊ดในบรรทัดเหล่านี้ครับ
1. เพิ่ม charmap array ตัวใหม่ลงไปในคลาส jmirc.IrcConnection

protected char[] tis620map = "uFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDuFFFDu0E01u0E02u0E03u0E04u0E05u0E06u0E07u0E08u0E09u0E0Au0E0Bu0E0Cu0E0Du0E0Eu0E0Fu0E10u0E11u0E12u0E13u0E14u0E15u0E16u0E17u0E18u0E19u0E1Au0E1Bu0E1Cu0E1Du0E1Eu0E1Fu0E20u0E21u0E22u0E23u0E24u0E25u0E26u0E27u0E28u0E29u0E2Au0E2Bu0E2Cu0E2Du0E2Eu0E2Fu0E30u0E31u0E32u0E33u0E34u0E35u0E36u0E37u0E38u0E39u0E3AuFFFDuFFFDuFFFDuFFFDu0E3Fu0E40u0E41u0E42u0E43u0E44u0E45u0E46u0E47u0E48u0E49u0E4Au0E4Bu0E4Cu0E4Du0E4Eu0E4Fu0E50u0E51u0E52u0E53u0E54u0E55u0E56u0E57u0E58u0E59u0E5Au0E5Bu0E5Cu0E5Du0E5E".toCharArray();

มองเผิน ๆ อาจจะเป็น string แต่จริง ๆ มันมีเรียกเมธอด toCharArray() ต่อท้าย ดังนั้นมันก็จะเป็น array ครับ ทีนี้มันจะมีโค๊ดข้างล่าง ก็คือ method IrcConnect.generateHashMap() ที่จะแมพโค๊ดตั้งแต่ 0x80 กับ array ข้างบน ดังนี้

private Hashtable generateHashmap(char[] encmap) {
    Hashtable ret = new Hashtable();

    for (int i = 0; i < encmap.length; i++) {
        ret.put(new Character(encmap[i]), new Byte((byte) (0x80 + i)));
    }

    return ret;
}

จุดที่ผมแก้จุดที่สองก็คือส่วน IrcConnection.byteArrayToString() ก็แค่เพิ่ม map อันใหม่ที่เพิ่งทำเมื่อกี้นี้ลงไป แบบนี้ครับ

if (encoding.equals("KOI8-R")) {
    map = koi8rmap;
 } else if (encoding.equals("Windows-1251")) {
    map = cp1251map;
 } else if (encoding.equals("Windows-1255")) {
    map = cp1255map;
 } else if (encoding.equals("TIS-620")) {
    map = tis620map;
 }

อันข้างบนคือแปลงจาก array -> string ส่วนแปลงกลับ ก็แก้ตรงนี้เพิ่มครับ method stringToByteArray

      if (encoding.equals("KOI8-R") || encoding.equals("Windows-1251") || encoding.equals("Windows-1255") ||   encoding.equals("TIS-620")) {
            if (hashmap == null || !encoding.equals((String) hashmap.get("encoding"))) {
                if (encoding.equals("KOI8-R")) {
                    hashmap = generateHashmap(koi8rmap);
                } else if (encoding.equals("Windows-1251")) {
                    hashmap = generateHashmap(cp1251map);
                } else if (encoding.equals("Windows-1255")) {
                    hashmap = generateHashmap(cp1255map);
                } else if (encoding.equals("TIS-620")) {
                    hashmap = generateHashmap(tis620map);
                }
                hashmap.put("encoding", encoding);
            }

แค่ข้างบนนี้ก็หมดแล้วเรื่องการ encode/decode แต่ว่าถ้าทำแค่นี้ก็จะไม่มีใครมาเรียก เพราะว่าเรายังไม่ได้เพิ่มให้ user สามารถเลือก encoding เป็น TIS-620 ได้

ก็แก้เพิ่มที่ class jmIrc เมธอด commandAction ดังนี้

                                cg_encoding = new ChoiceGroup("Character encoding", ChoiceGroup.EXCLUSIVE);
				cg_encoding.append("ISO-8859-1", null);
				cg_encoding.append("ISO-8859-2", null);
				cg_encoding.append("UTF-8", null);
				cg_encoding.append("KOI8-R", null);
				cg_encoding.append("Windows-1251", null);
				cg_encoding.append("Windows-1255", null);
				cg_encoding.append("TIS-620", null);
				if (db.encoding.equals("ISO-8859-1")) cg_encoding.setSelectedIndex(0, true);
				else if (db.encoding.equals("ISO-8859-2")) cg_encoding.setSelectedIndex(1, true);
				else if (db.encoding.equals("UTF-8")) cg_encoding.setSelectedIndex(2, true);
				else if (db.encoding.equals("KOI8-R")) cg_encoding.setSelectedIndex(3, true);
				else if (db.encoding.equals("Windows-1251")) cg_encoding.setSelectedIndex(4, true);
				else if (db.encoding.equals("Windows-1255")) cg_encoding.setSelectedIndex(5, true);
				else if (db.encoding.equals("TIS-620")) cg_encoding.setSelectedIndex(6, true);
				else cg_encoding.setSelectedIndex(0, true);

แค่นี้ก็จะโชว์ในหน้า config แล้ว ...

จบ ... เอ๊ะ เดี๋ยวสิ ผมต้องเปิดโค๊ดด้วยใช่มั้ยครับ ??? เอางั้นก็เอาโค๊ดไปตามนี้ jmIrc-0.96 + tis620 src

คำเตือน ผมยังไม่ได้ทดสอบอะไรเท่าไหร่นะครับ ... ถ้าเจ้าโปรแกรมนี้สร้างปัญหาใด ๆ กับมือถือท่านผมไม่รับผิดชอบนะครับ อ้อ โปรแกรมนี้ใช้ใบอนุญาตแบบ GPL นะครับ ดังนั้นเอาไปแก้เล่นได้ครับผม ... ที่สำคัญ โปรแกรมนี้ผมไม่ได้เป็นคนสร้างนะครับ (เวปไซท์บอกแล้วข้างบน) แต่ว่าแก้ให้มันใช้ TIS-620 ได้เฉย ๆ

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

This site uses Akismet to reduce spam. Learn how your comment data is processed.