โดยปกติแล้ว 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
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]
เสร็จแล้วกับโค๊ดแสนจะง่าย