สมมุติว่าเราจะใช้ Charset เป็น tis-620 ( เป็น Charset ของภาษาไทยครับ ย่อมาจาก Thai Industrial Standard 620-2533 ซึ่งเป็น ASCII ถ้าจะให้สากลก็ใช้ uft_8 ซึ่งเป็น Unicode แต่ว่าถ้าเป็นงานภาษาไทยผมก็ใช้ tis แล้วแต่ชอบครับ )
_ci ข้างหลังหมายถึง ( เช่น utf_8_unicode_ci ) Case Insensitive นะครับ ก็คือว่ามันจะมอง A กับ a เหมือนกัน มีประโยชน์ตอนที่จะ select ข้อมูลขึ้นมาครับ ในกรณีที่เราไม่สนว่าจะเป็นพิมพ์เล็ก พิมพ์ใหญ่ ถ้ามี _bin ต่อท้ายหมายถึง Binary อันนี้มันก็จะมอง A กับ a ไม่เหมือนกันแล้วครับ )
ทางฝั่ง Server ถ้าจะใช้ NAMES ก็ได้เหมือนกันครับ มันหมายถึงทั้งหมด ( มั้งนะไม่ค่อยชัวแต่น่าจะใช่ ) ถ้าจะให้ดีก็ ส่ง query นี้ก่อนทุกครั้งที่จะมีการ INSERT, UPDATE, SELECT นะครับ
<?php mysql_query( "SET NAMES tis620" ); ?>
แต่ว่าสำหรับบางที่ Host เค้าไม่อนุญาติให้เรากำหนด Charset เองครับ ดังนั้นเราควรที่จะให้มันแสดง Error ด้วยจะได้รู้ ว่ามัน Set ค่าแล้วหรือยัง โดยใช้อันนี้แทนครับ
<?php mysql_query( "SET NAMES tis620" ) or die( "Query ล้มเหลวเพราะ : ". mysql_error() ); ?>
ถ้ามัน SET NAMES ไม่ได้มันจะหยุดทำงานแล้วแสดง Error
สำหรับคำสั่ง die() คือจะสั่งให้ php หยุดทำงานทันที จะใช้ลอยๆก็ได้ถ้าอยากให้ php หยุดทำงาน ( ใช้เวลา DEBUG ) หรือเวลาตรวจสอบ สถานะการเข้าถึง ( ตรวจสอบ SESSION )
เช่นตัวอย่างการใช้ die() ในกรณีอื่นๆ
<?php $error = "ข้อความอะไรก็ได้ ที่อยากจะให้แสดงสำหรับ error นั้นๆ"; die( $error ); ?> หรือในกรณีตรวจสอบสถานะการ Login <?php if( !session_is_registered( "login" ) ) die( "กรุณาทำการ Login ก่อนครับ !!!" ); //จะไม่ทำงานโค้ดใน statement ถัดไป ....... ...... ... ?>
ถ้า Host ไม่อนุญาติให้เราใช้ SET NAMES จะมีวิธีแก้คือ เข้าไปดูว่าที่ Host เค้าใช้ Charset อะไร ใน phpmyadmin ตรงตารางที่เราสร้าง ในช่อง Collation แล้วให้ใช้ iconv ในการแปลงข้อมูลแทนครับใช้ได้เฉพาะ Host ที่ที่มี PHP 4 >= 4.0.5, PHP 5
ใช้ iconv สำหรับแปลงไปเป็น Charset ที่เราต้องการเช่น ถ้าเราไปดูแล้วมันเป็น latin_swedish เราก็ต้องใส่ว่า แปลงจาก latin1 ไปเป็น tis-620
ปัญหามันจะอยู่ที่ว่าชื่อของ collation ที่มันแสดงกับที่เราจะเอามาใส่ใน iconv ไม่เหมือนกันนี่แหละ ต้องลองไป search google หาดูว่า ถ้าเป็น charset ชื่อนี้ต้องใช้ว่าอะไร
รูปแบบการใช้งาน iconv iconv ( $in_charset, $out_charset, $str ) $in_cahrset : charset ที่มันเป็นอยู่ $out_charset : charset ที่เราต้องการจะแปลงให้เป็น $str : ข้อความที่เราต้องการจะแปลง
<?php $result = "Old thai text : ". $thaitext. " New thai text : "; $result .= iconv( "latin1", "tis-620", $thaitext ); echo $result; ?>
อันนี้น่าจะใช้ได้นะครับ
เพิ่มบรรทัดนี้ลงไปใน HTML ข้างใน Tag head ด้วยครับ เพื่อการเลือกแสดงผลที่ถูกต้อง ตรง charset เปลี่ยนตามที่เราจะใช้นะครับ
<head> <meta http-equiv="Content-Type" content="text/html; charset=tis-620" /> </head>
ปล.
nattster: จริงๆ ขึ้นอยู่กับข้อมูลที่เก็บเข้าไปใน mysql ตอนแรกด้วยนะครับ
ถูกต้องเลยครับ ดังนั้นแล้วต้องล้างตารางแล้วใส่ข้อมูลเข้าไปใหม่ด้วนนะครับ ถ้าจะให้ชัวร์ก็ต้อง เขียน query แล้ว insert เข้าไปเองไม่ใช้ phpmyadmin ของ Host ( อย่าลืม setname ก่อนส่ง query ทุกครั้งเพื่อความชัวร์ ใช้ loop วนเอาครับ ทำเองไม่ยากหรอก )
อ่านดีๆก่อนใช้ Host ด้วยนะครับ บางที่เค้าจะห้ามใช้ภาษาที่ไม่ใช้ภาษาอังกฤษด้วยนะครับ ต้องดูตรงเงื่อนไข ดังนั้นถ้าเค้าจะไม่รองรับ ภาษาไทยก็ต้องทำใจครับ
อ่านเกี่ยวกับ UTF-8, TIS620, iconv เพิ่มเติมได้ที่
http://en.wikipedia.org/wiki/Utf8 http://en.wikipedia.org/wiki/TIS620 http://th.php.net/manual/en/function.iconv.php
<code>
<foo>
[foo]
More information about formatting options
สมมุติว่าเราจะใช้ Charset เป็น tis-620 ( เป็น Charset ของภาษาไทยครับ ย่อมาจาก Thai Industrial Standard 620-2533 ซึ่งเป็น ASCII ถ้าจะให้สากลก็ใช้ uft_8 ซึ่งเป็น Unicode แต่ว่าถ้าเป็นงานภาษาไทยผมก็ใช้ tis แล้วแต่ชอบครับ )
_ci ข้างหลังหมายถึง ( เช่น utf_8_unicode_ci ) Case Insensitive นะครับ ก็คือว่ามันจะมอง A กับ a เหมือนกัน มีประโยชน์ตอนที่จะ select ข้อมูลขึ้นมาครับ ในกรณีที่เราไม่สนว่าจะเป็นพิมพ์เล็ก พิมพ์ใหญ่ ถ้ามี _bin ต่อท้ายหมายถึง Binary อันนี้มันก็จะมอง A กับ a ไม่เหมือนกันแล้วครับ )
ทางฝั่ง Server ถ้าจะใช้ NAMES ก็ได้เหมือนกันครับ มันหมายถึงทั้งหมด ( มั้งนะไม่ค่อยชัวแต่น่าจะใช่ )
ถ้าจะให้ดีก็ ส่ง query นี้ก่อนทุกครั้งที่จะมีการ INSERT, UPDATE, SELECT นะครับ
แต่ว่าสำหรับบางที่ Host เค้าไม่อนุญาติให้เรากำหนด Charset เองครับ ดังนั้นเราควรที่จะให้มันแสดง Error ด้วยจะได้รู้ ว่ามัน Set ค่าแล้วหรือยัง โดยใช้อันนี้แทนครับ
ถ้ามัน SET NAMES ไม่ได้มันจะหยุดทำงานแล้วแสดง Error
สำหรับคำสั่ง die() คือจะสั่งให้ php หยุดทำงานทันที จะใช้ลอยๆก็ได้ถ้าอยากให้ php หยุดทำงาน ( ใช้เวลา DEBUG ) หรือเวลาตรวจสอบ สถานะการเข้าถึง ( ตรวจสอบ SESSION )
เช่นตัวอย่างการใช้ die() ในกรณีอื่นๆ
ถ้า Host ไม่อนุญาติให้เราใช้ SET NAMES จะมีวิธีแก้คือ เข้าไปดูว่าที่ Host เค้าใช้ Charset อะไร ใน phpmyadmin ตรงตารางที่เราสร้าง ในช่อง Collation
แล้วให้ใช้ iconv ในการแปลงข้อมูลแทนครับใช้ได้เฉพาะ Host ที่ที่มี PHP 4 >= 4.0.5, PHP 5
ใช้ iconv สำหรับแปลงไปเป็น Charset ที่เราต้องการเช่น ถ้าเราไปดูแล้วมันเป็น latin_swedish เราก็ต้องใส่ว่า แปลงจาก latin1 ไปเป็น tis-620
ปัญหามันจะอยู่ที่ว่าชื่อของ collation ที่มันแสดงกับที่เราจะเอามาใส่ใน iconv ไม่เหมือนกันนี่แหละ ต้องลองไป search google หาดูว่า ถ้าเป็น charset ชื่อนี้ต้องใช้ว่าอะไร
รูปแบบการใช้งาน iconv
iconv ( $in_charset, $out_charset, $str )
$in_cahrset : charset ที่มันเป็นอยู่
$out_charset : charset ที่เราต้องการจะแปลงให้เป็น
$str : ข้อความที่เราต้องการจะแปลง
อันนี้น่าจะใช้ได้นะครับ
เพิ่มบรรทัดนี้ลงไปใน HTML ข้างใน Tag head ด้วยครับ เพื่อการเลือกแสดงผลที่ถูกต้อง ตรง charset เปลี่ยนตามที่เราจะใช้นะครับ
ปล.
ถูกต้องเลยครับ ดังนั้นแล้วต้องล้างตารางแล้วใส่ข้อมูลเข้าไปใหม่ด้วนนะครับ ถ้าจะให้ชัวร์ก็ต้อง เขียน query แล้ว insert เข้าไปเองไม่ใช้ phpmyadmin ของ Host ( อย่าลืม setname ก่อนส่ง query ทุกครั้งเพื่อความชัวร์ ใช้ loop วนเอาครับ ทำเองไม่ยากหรอก )
อ่านดีๆก่อนใช้ Host ด้วยนะครับ บางที่เค้าจะห้ามใช้ภาษาที่ไม่ใช้ภาษาอังกฤษด้วยนะครับ ต้องดูตรงเงื่อนไข ดังนั้นถ้าเค้าจะไม่รองรับ ภาษาไทยก็ต้องทำใจครับ
อ่านเกี่ยวกับ UTF-8, TIS620, iconv เพิ่มเติมได้ที่
http://en.wikipedia.org/wiki/Utf8
http://en.wikipedia.org/wiki/TIS620
http://th.php.net/manual/en/function.iconv.php