Friday, May 27, 2005

Sitemesh unsupported encoding

วันนี้แวะไปบริษัทฯ ได้รับแจ้งว่าตัว tapestry มีปัญหา
กับ sitemesh โดยเกิด exception ที่ตัว
sitemesh ที่ Class TextEncoder
มีข้อความว่า "Unsupported encoding Windows-874"

ก็เลยต้องใล่ดู source code ของ Sitemesh
พบว่าตัว Class TextEncoder ใช้
class java.nio.charset.Charset ในการ check encoding
ซึ่งการเรียก Charset.isSupport("Windows-874")
จะได้ผลลัพท์เป็น false

ก็เลยพยายามนั่งหาว่า
ใครเป็นคนทำให้เกิด charset Windows-874 ขึ้นมา
ทดลอง -Dfile.encoding=TIS-620 ก็แล้ว
ทดลองใส่ <meta-equiv="content-type" content="text/html;charset=TIS-620" />
ก็ยังเป็นอยู่

จากนั้นก็ลองไปทดสอบบน linux server
พบว่าเจ้า Windows-874 ยังตามมาหลอกหลอน
ก็เลยรู้ว่าเป็นปัญหาที่ตัว Tapestry ยังแน่นอน
จากการไล่ดู พบว่าที่ Application config file มีการใส่ว่า
<property name="org.apache.tapestry.output-encoding">Windows-874</property>

ก็เลยจัดการเปลี่ยนเป็น
<property name="org.apache.tapestry.output-encoding">tis-620</property>


ส่วนประเด็นว่าใครเป็นคนใส่เข้ามา
ก็พบว่าตัวเองนี่แหล่ะเคยเขียน App ไว้ App หนึ่ง
ที่ config ไว้แบบนี้
สมัยนั้นไม่ได้ใช้ sitemesh ก็เลยไม่เกิดปัญหาอะไร
พอมาเริ่มโปรเจคใหม่ น้องๆเขาก็เล่น copy
มาทั้งดุ้น ก็เลยเกิดปัญหาขึ้น

จากการใล่ทดสอบดูพบประเด็นเพิ่มเติมดังนี้
  • ถ้าเราใช้ jdk1.5 คำสั่ง Charset.isSupport("Windows-874")
    จะได้ผลลัพท์เป็น True
    ส่วน jdk1.4 ได้ผลลัพท์เป็น false
  • กรณีที่เราไม่ได้ระบุค่า org.apache.tapestry.output-encoding
    ค่า default ของ Tapestry ก็คือ utf-8
  • ใน tapestry ถ้าเราใช้ component shell
    ตัว tapestry จะ generate meta-equiv="content-type"
    ให้เราโดยอัติโนมัติ

Related link from Roti

No comments: