02 August 2013

แปลง String ให้เป็น Unicode

Updated on

โดยปกติแล้ว String ที่ใช้กันอยู่ในแอปพลิเคชันนั้นจะเป็นแบบ UTF-16
ซึ่งบทความนี้ก็จะเป็นตัวอย่างการแปลงจาก UTF-16 เป็น Unicode 


เนื่องด้วย Unicode เป็นมาตรฐานภาษาแบบหนึ่งที่นิยมใช้กันอย่างแพร่หลาย
ซึ่งในบางครั้งผู้ที่หลงเข้ามาอ่านก็ต้องการใช้งาน String ในรูปของ Unicode
ก็เลยนำคลาสที่จะช่วยแปลง String ให้กลายเป็น Unicode  มาให้ใช้กัน
ซึ่งตัวอย่างนี้ก็จะง่ายมาก แค่เรียกใช้คลาสดังกล่าวก็เสร็จเรียบร้อยแล้ว
สำหรับคลาสที่ว่านี้ เจ้าของบล็อกจะตั้งชื่อคลาสไว้ว่า UnicodeFormatter

UnicodeFormatter.java
public class UnicodeFormatter { public static String parseUnicode(String s) { if (s == null) return null; String result = new String(); for (int i = 0 ; i < s.length(); i++) { char c = s.charAt(i); result += "\\u" + UnicodeFormatter.charToHex(c); } return result; } private static String byteToHex(byte b) { return Integer.toHexString((b >> 4) & 0x0f) + Integer.toHexString(b & 0x0f); } private static String charToHex(char c) { byte hi = (byte) (c >>> 8); byte lo = (byte) (c & 0xff); return byteToHex(hi) + byteToHex(lo); } }

เวลาใช้งานก็เรียกใช้ง่ายๆดังนี้เลย
String str = "Hello World"; str = UnicodeFormatter.parseUnicode(str);

จาก Hello World ที่เป็น UTF-16 
เมื่อแปลงเป็น Unicode ก็จะได้ออกมาเป็น
\u0048\u0065\u006C\u006C\u006F\u0020\u0057\u006F\u0072\u006C\u0064
เมื่อสังเกตดีๆก็จะเป็นว่า ตัว H จะเป็น 0x0048 ใน Unicode 
ตัว L จะเป็น 0x006C และเว้นวรรคจะเป็น 0x0020 

เวลาจะนำคลาสดังกล่าวไปใช้งาน 
ก็แค่ก๊อปคลาสไว้ที่แพคเกจที่ต้องการได้เลย

เสร็จแล้วล่ะ แต่จะยกตัวอย่างตอนใช้งานด้วยเลยละกัน
เพื่อไม่ให้บทความนี้ดูสั้นจนเกินไป 555555

main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:focusable="true" android:focusableInTouchMode="true" android:gravity="center_horizontal" android:orientation="vertical" > <requestFocus /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="40dp" android:text="Normal String" android:textColor="#1f9387" android:textSize="20sp" /> <EditText android:id="@+id/etInput" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:ems="12" android:hint="Type here" android:maxLength="20" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="40dp" android:text="Unicode String" android:textColor="#1f9387" android:textSize="20sp" /> <EditText android:id="@+id/etOutput" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:editable="false" android:ems="12" /> </LinearLayout>

สำหรับในหน้า Layout ก็มี Edit Text ด้วยกันอยู่สองช่อง
โดยช่องแรกสำหรับพิมพ์ข้อความปกติลงไป
ส่วนช่องที่สองจะพิมพ์ไม่ได้ แต่จะให้แสดง
ข้อความที่พิมพ์ในช่องแรกที่แปลงเป็น Unicode
ให้สังเกตที่ xml ให้ดีๆ จะเห็นว่าเจ้าของบล็อกได้ทำการ
กำหนดให้ Edit Text ช่องที่สองไม่สามารถทำการแก้ไขได้
เพื่อให้ดูเหมาะสมในเวลาใช้งานที่ผู้ใช้จะได้แก้ไขไม่ได้


Main.java
package app.akexorcist.unicodeconverter; import android.os.Bundle; import android.app.Activity; import android.text.Editable; import android.text.TextWatcher; import android.widget.EditText; public class Main extends Activity { EditText etInput, etOutput; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); etOutput = (EditText)findViewById(R.id.etOutput); etInput = (EditText)findViewById(R.id.etInput); etInput.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) { String str = UnicodeFormatter.parseUnicode(s.toString()); etOutput.setText(str); } public void beforeTextChanged(CharSequence s, int start , int count, int after) { } public void onTextChanged(CharSequence s, int start , int before, int count) { } }); } }

กำหนด Edit Text ช่องแรกชื่อ etInput และช่องที่สองชื่อ etOutput 
โดย etInput จะประกาศเรียก Listener มาใช้เป็น TextWatcher
ที่จะทำงานเมื่อผู้ใช้พิมพ์ข้อความลงในช่อง etInput
โดยเจ้าของบล็อกใส่คำสั่งลงในฟังก์ชัน afterTextChanged
ที่เป็นกรณีหลังจากข้อความใน etInput เปลี่ยนแปลงแล้ว
ในนี้ก็จะให้ทำการแปลงข้อความจาก UTF-16 เป็น Unicode 
แล้วนำไปแสดงใน etOutput ก็เป็นอันเสร็จเรียบร้อยแล้ว

เมื่อทดสอบดู Unicode ก็จะแสดงขึ้นมาทันทีที่พิมพ์ในช่อง etInput



สำหรับผู้ที่หลงเข้ามาอ่านคนใดต้องการไฟล์ตัวอย่าง
สามารถดาวน์โหลดได้ที่ Unicode Converter [Google Drive]


เสร็จแล้วกับโค๊ดแสนจะง่าย