Home > Uncategorized > Ruby กับ UTF8

Ruby กับ UTF8

April 10th, 2008

คิดว่าคงจะรู้กันโดยทั่วไปแล้ว ว่าเราสามารถใช้ Ruby กับ String ที่เข้ารหัสแบบ UTF-8 ได้ ที่ว่าใช้ได้นี่หมายความว่า ได้ข้อมูล (ข้อความ) มา ก็สามารถเก็บลงไปในตัวแปรได้เลย ไม่เกิดปัญหาอะไร แต่โดยการทำงานจริงๆ แล้ว Ruby ไม่ได้สนับสนุน UTF-8 หรือการเข้ารหัสข้อความแบบใดๆ ทั้งสิ้น เพียงแค่พิจารณาว่า String ก็คือลำดับของตัวอักษร ที่ตัวอักษรหนึ่งตัวมีขนาดเท่ากัน (จะเป็น 1 ไบต์ หรือ 2 ไบต์ ก็แล้วแต่การใช้งาน) ดังนั้นจึงใช้กับ UTF-8 ที่เก็บตัวอักษรแต่ละตัวด้วยที่ไม่เท่ากันไม่ได้

พอดีช่วงนี้กำลังเขียน Ruby เพื่อจัดการข้อความภาษาไทย และพยายามออกแบบให้จัดการกับภาษาอื่นๆ ได้ด้วย ก็เลยต้องเก็บทุกอย่างไว้เป็น UTF-8 จะได้ไม่เสียเวลาแปลงข้อมูล เสร็จแล้วทีนี้จะต้องเข้าถึงตัวอักษรแต่ละตัวเพื่อคำนวณค่าอะไรบางอย่าง จะใช้ [] ก็ไม่ได้แล้ว เพราะจะได้ตัวอักษรไม่ตรงตัว สุดท้ายเลยต้องไปหา gem ที่ช่วยจัดการ UTF-8 มาลองใช้ด้วย เท่าที่ลองหาดูก็เจอ

  • icu4r เป็น binding ที่ทำให้ Ruby ใช้ความสามารถของ ICU ได้ โดยสร้าง class ใหม่ชื่อ UString มาใช้โดยเฉพาะ ดูท่าทางจะใช้ได้ดี แต่ก็มีข้อเสียอยู่ที่ติดตั้งยาก ต้องลง ICU ไว้ในระบบก่อน สุดท้ายเลยเลิกไป
  • utf8proc เป็น module อีกอันหนึ่ง ที่เพิ่มส่วนขยายให้คลาส String ซึ่งก็มีข้อจำกัดในฟังก์ชันการทำงาน แถมยังไม่ค่อยมีเอกสารเท่าไหร่
  • character-encodings อันนี้ไปเจอทีหลังสุด ฟีเจอร์ต่างๆ ก็ดูดี ใช้งานไม่ยุ่งยาก (แต่อาจจะหาเอกสารยากเหมือนกัน) แต่คนเขียนพยายามบอกว่ามันคือส่วนหนึ่งที่อาจจะรวมเข้าไปใน Ruby 2.0 เลยเลือกใช้อันนี้

การใช้งานก็ไม่ยาก ลองดูตามตัวอย่างนี้ได้เลย

require 'rubygems'
require 'encoding/character/utf-8'
s = +"สวัสดีครับ"
a = Array.new
s.each_char {|c| a << c}

แค่นี้เราก็แยกตัวอักษรแต่ละตัวจาก s ไปไว้ในอะเรย์ a ได้เลย ตัวอักษรแต่ละตัวก็ยังเก็บในฐานะ String เหมือนเดิม ถ้ามองในแง่ความสะดวกแล้ว การทำแบบนี้ก็ง่ายดี แต่ดูแล้วมันต้องแปลงไปแปลงมาอยู่หลายรอบเหมือนกัน

Uncategorized ,

  1. No comments yet.
  1. No trackbacks yet.