workaround สำหรับ jitar, ภาษาไทย และ UTF-8 บน Windows อาจจะ GNU/Linux ด้วย

ถ้าใช้ JRE บน Windows มันจะเลือก encoding เป็น MS874 ให้ ส่วนบน GNU/Linux ก็ซวยไป ถ้าเป็น Solaris ก็ไม่มีปัญหาอะไร เรื่องแบบนี้จะไปแก้ใน jitar ก็ใช่ที่ จะแก้ JRE ก็ไม่ไหว ก็เลย ทำ jitar ให้ใช้ UTF-8 แบบบังคับไปก่อน แต่ไม่ request pull นะ เพราะมันไม่น่าทำ น่าแก้ที่ JRE หรือไม่ก็เปลี่ยนไปใช้ MS874 มั้ง

http://www.oracle.com/technetwork/java/javase/locales-137662.html
https://github.com/veer66/jitar

กรณีเจ๊งของ PHP และ regular expression เวลาเจอภาษไทย + UTF-8

ถ้ามี code แบบนี้ใช้ charset เป็น UTF-8

<?php
	print_r(preg_split("/\\s/", "ประเภท"));
?>

แบบนี้มันไม่น่าจะ split ได้เพราะว่า ไม่มี space ใน “ประเภท” เลยแต่มัน split ได้ซะงั้น

Array
(
    [0] => เธ›เธฃเธฐเน€เธ
    [1] => เธ—
)

แถวๆ “ภ” มันคงแปลงไปเป็นอะไรแล้ว code ไปเป็น space มั้ง

แต่ไม่ว่าจะเพราะว่าอะไร มีท่าแก้ง่ายๆ แบบนี้ใส่ u เข้าไป หายครับ

<?php
	print_r(preg_split("/\\s/u", "ประเภท"));
?>

ผมใช้ php 5.3.5 ที่มากับ xampp 1.7.4 และทดลองบน Windows 7 ครับ

แก้ mysql ให้ใช้ UTF-8 ใน my.ini/my.cnf

ผมก็เอามาแปะเลยแล้วกันนะ

[client]
default-character-set=utf8

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
collation_server=utf8_unicode_ci
character_set_server=utf8
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

ผมเพิ่มบรรทัดที่มี utf8 เข้าไป

Python + MySQL + UTF-8

import MySQLdb as db
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
conn = db.connect(host="localhost", user="root",
                  passwd="", db="kulex",
                  use_unicode=True, charset="UTF8")
c = conn.cursor()
c.execute("SELECT * FROM `Classifier`")
while True:
    row = c.fetchone()
    if row == None:
        break
    for col in row:
        print col
c.close()
conn.close()

CakePHP 1.2 + ภาษาไทย + UTF-8 + MySQL

default encoding ของ MySQL เท่าที่ผมใช้ไม่ได้เป็น UTF-8. เวลาใช้ CakePHP ก็เลยต้องแก้ configuration นิดหน่อยเพื่อทำให้ ใช้ UTF-8 และ MySQL ได้เนียนๆ. ใน CakePHP รุ่นก่อนๆ หน้านี้บางทีก็ต้องไปแก้ AppModel ที่ไม่ค่อยเท่เท่าไหร่ เพราะน่าจะต้องมาแก้อีกเวลา port ไปใช้ database ตัวอื่นที่ไม่ใช่ MySQL.

ใน Cake 1.2.x สามารถตั้งค่า encoding/charset แบบรวมศูนย์ได้ใน app/config/database.php เลย. ตามตัวอย่างแบบด้านล่าง

class DATABASE_CONFIG {

    var $default = array(
        'driver' =&gt; 'mysql',
        'persistent' =&gt; false,
        'host' =&gt; 'localhost',
        'login' =&gt; 'your_username',
        'password' =&gt; 'your_password',
        'database' =&gt; 'my2',
        'prefix' =&gt; '',
        'encoding' =&gt; 'UTF8' #ดูบรรทัดนี้เป็นสำคัญ
    );

    var $test = array(
        'driver' =&gt; 'mysql',
        'persistent' =&gt; false,
        'host' =&gt; 'localhost',
        'login' =&gt; 'user',
        'password' =&gt; 'password',
        'database' =&gt; 'test_database_name',
        'prefix' =&gt; '',
    );
}
?&gt;

เพื่อม ‘encoding’ => ‘UTF8’ เข้าไปก็ทำให้ใช้ภาษาไทยและ UTF-8 ได้เนียนๆ แล้ว.

พอมาเปิดใน phpmyadmin ที่ตั้งค่าให้ใช้ UTF-8 และภาษาไทย

ก็แสดงผลออกมาได้ถูกต้อง.

สรุปว่าถ้าอยากใช้ UTF-8 กับ MySQL ใน CakePHP 1.2.x ก็เข้าไปตั้งค่าได้ใน app/config/database.php

อ้างอิง

อ่านไฟล์ UTF-8 ด้วย libicu และภาษา C

ICU เป็น library สำหรับจัดการเกี่ยวกับข้อความภาษาต่างๆ นานา โดยเฉพาะที่เก็บโดยใช้ Unicode ในภาษา C, C++ และ Java. ผมก็ด้อมๆ มองอยู่นานแล้วก็ยังไม่ค่อยได้ลองใช้เท่าไหร่. พอดีวันนี้อยากอ่านไฟล์ข้อความที่เข้ารหัสไว้แบบ UTF-8 แต่ว่าพออ่านมาแล้วอยากจะแปลงเป็น UCS-4 หรือ UCS-2 ก็ได้. จะเขียนทั้งหมดก็พอมี source code เก่าเอามา reuse ได้. แต่มันก็คงไม่สนุกลองใช้ ICU ดูบ้างดีกว่า. โปรแกรมข้างล่างนี่ก็จะพิมพ์มีรหัส unicode (ในแบบเลขฐาน 16) ของอักษรแต่ละตัวมาให้ดู. สมมุติว่าไฟล์ชื่อ playu.c นะ.


#include 
#include 
#include 
int
main()
{
#define   BUF_SIZE   4096
    UFILE *fp;
    UChar buf[BUF_SIZE];
    int read_size;

   
    if((fp = u_fopen("thai_utf8.txt", "r", NULL, "UTF-8")) == NULL) {
        printf("Cannot open file\n");
        exit(EXIT_FAILURE);
    }
    while((read_size = u_file_read(buf, BUF_SIZE, fp)) &gt; 0) {
        int i;
        for(i = 0; i &lt; read_size; i++)
            printf(&quot;0x%04X\n&quot;, buf[i]);
    }
    u_fclose(fp);
    return EXIT_SUCCESS;
}

เวลาจะ build ก็สั่งแบบนี้

gcc -Wall -g -licuio playu.c

ก็จะได้ a.out ออกมา

สมมุติอีกนิดว่าในไฟล์ thai_utf8.txt มีอักษรเขียนว่า ก์ แล้วก็ขึ้นบรรทัดใหม่

พอ run a.out ก็ได้จะผลแบบข้างล่าง

$ ./a.out
0x0E01
0x0E4C
0x000A
$

ทีแรกนึกว่าจะใช้ยากดูแบบนี้ก็คล้ายๆ ใช้ libc ธรรมดาดี ชอบๆ :-).