|
|
|
PHPWord ภาษาไทย มีปัญหาเรื่องการแสดงภาษาไทย ใครเจออย่างผมบ้าง |
|
|
|
|
|
|
|
พอดีว่าได้รับคำแนะนำจาก พี่วิน ว่า ถ้าต้องการออกรายงานให้ลองใช้ PHPWord (http://phpword.codeplex.com/)
ก็เลยลองโหลดมาใช้ดู ใช้แล้วก็รู้สึกว่าเวิคมากเลย แต่มันติดปัญหา (สำหรับผมคนเดียวหรือเปล่าไม่รู้)
คือผมทำการ Select ข้อมูลจาก DataBase (MySql) มาเพื่อจะนำข้อมูลมาใส่ลงใน Word
สำหรับข้อมูลที่เป็นภาษาอังกฤษสามารถแสดงได้ไม่มีปัญหาอะไร
แต่ข้อมูลที่เป้นภาษาไทยจะแสดงออกมาอย่างนี้
จากโค้ดการ Select ข้อมูลนี้ครับ
Code (PHP)
<?php ob_start();?>
<?php if ($complete=="true"){ ?>
<script type="text/javascript">
window.location="gbook.php";
</script>
<?php } ?>
<?php
require_once '../PHPWord.php';
include_once("../Class/generated_classes/class.course.php");
include_once("../Class/generated_classes/sql.php");
$objCou = new course();
$objCou->select('1');
$objFac = new faculty();
$objFac->getFacultyTName('1', $objCou->getCOURSE_Code() );
$objFac->getDepartmentTName('1',$objCou->getCOURSE_Code());
$objFac->getCoursePreq('1',$objCou->getCOURSE_Code());
$objFac->getCourseTnameEname($objFac->CoursePreq);
$objFac->getCourseTDesc($objFac->CoursePreq);
$PHPWord = new PHPWord();
// New portrait section
$document = $PHPWord->createSection();
$PHPWord->addFontStyle('rStyle', array('bold'=>true, 'italic'=>true, 'size'=>16));
$PHPWord->addParagraphStyle('pStyle', array('align'=>'center', 'spaceAfter'=>100));
$document->addText('Customer Report', 'rStyle', 'pStyle');
$document = $PHPWord->loadTemplate('F-QAO-090.docx');
$document->setValue('FAC_TName', $objFac->FACTname);//
$document->setValue('DEP_TName',$objFac->DEPTName);
$document->setValue('ID_Courses',$objCou->getCOURSE_Code());
$document->setValue('TNAME', $objCou->getCOURSE_TName());
$document->setValue('EName', $objCou->getCOURSE_EName());
$document->setValue('Credit', $objCou->getCOURSE_Credit());
$document->setValue('Lec', $objCou->getCOURSE_Lec());
$document->setValue('Lab', $objCou->getCOURSE_Lab());
$document->setValue('Self', $objCou->getCOURSE_Self());
$document->setValue('COURSEPreq', $objFac->CoursePreq);
$document->setValue('PreqTName', $objFac->CourseTName);
$document->setValue('PreqEName', $objFac->CourseEName);
$document->setValue('CourseTDesc', $objFac->CourseTDesc);
$objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007');
$document->save('FQAO090Edit.docx');
header('Location: FQAO090Edit.docx');
?>
แต่ถึงแม้ว่าผมจะลองใสข้อมูลที่เป็นภาษาไทยลงไปเลยโดยไม่ได้ Select จาก Base ก็ยังเป็นภาษาแบบแปลกๆอยู่ดีครับ
ตัวอย่างเช่น
Code (PHP)
$document->setValue('Self', 'เทสข้อมูลภาษาไทย');
ใครพอทราบสาเหตุช่วยชี้แนะหน่อยครับ...
Tag : PHP, MySQL
|
|
|
|
|
|
Date :
2012-05-28 09:48:10 |
By :
MaTaDoRcpe |
View :
7619 |
Reply :
39 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PHPWord ผมไม่รู้นะ เป็นที่การตั้งค่าเพจหรือเปล่า ไม่งั้นก็ดูตอน save เพจ ในEditPlus เป็นแบบไหน ANSI หรือ UTF-8 เพราะของผม save เป็น UTF-8 หมดเลย ผมเดาเอานะ
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
|
|
|
|
Date :
2012-05-28 09:58:30 |
By :
บู้ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ลองดูบรรทัดที่ 30 เป็นเพราะ font นี้หรือเปล่า 'italic' ลองเปลี่ยนดู
$PHPWord->addFontStyle('rStyle', array('bold'=>true, 'italic'=>true, 'size'=>16));
|
|
|
|
|
Date :
2012-05-28 10:13:47 |
By :
บู้ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tahoma หรือ ms sans serif ก็ได้
$PHPWord->addFontStyle('rStyle', array('bold'=>true, 'tahoma'=>true, 'size'=>16));
|
|
|
|
|
Date :
2012-05-28 10:31:25 |
By :
บู้ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
แก้ตามคุณ "บู้" ไม่น่าจะถูกนะครับ น่าจะเป็นตามนี้ครับ
http://phpword.codeplex.com/documentation
ตรงที่คุณ "บู้" นั้นคิดว่าเป็นการทำให้ตัวเอียงหรือไม่เอียงเท่านั้น สิ่งที่แก้ควรจะเป็น Font name ครับ
ตามตัวอย่างที่ให้ไปคือบันทัดนี้ครับ
Code (PHP)
$PHPWord->addFontStyle('rStyle', array(name=>'Tahoma', 'bold'=>true, 'italic'=>true, 'size'=>16));
//เพิ่ม name แต่ italic=true ถ้าจะให้มันเอียง
ยังไงลองแจ้งผลลัพธ์มาดูนะครับ ถ้าผิดจะไดเแก้ไขกันต่อไป
|
|
|
|
|
Date :
2012-05-28 10:40:16 |
By :
Songkram |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ลองแล้วยังติดปัญหาภาษาไทยเช่นเดียวกัน เลยยังไม่ได้ดูต่อ ถ้าได้ก็บอกด้วยครับ
|
|
|
|
|
Date :
2012-05-28 10:53:10 |
By :
mr.win |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอโทษครับ งงกับกราฟอยู่ คิดว่าเป็นชื่อ font (@_@)
|
|
|
|
|
Date :
2012-05-28 10:58:30 |
By :
บู้ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ใส่ ' ' เข้าไปดูครับ เห็นในตัวอย่าง
$PHPWord->addFontStyle('rStyle', array('name'=>'Tahoma', 'bold'=>true, 'italic'=>true, 'size'=>16));
|
|
|
|
|
Date :
2012-05-28 11:02:13 |
By :
บู้ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ถ้าลองทุกวิธีทางแล้วยังไม่ได้ สงสัยน่าจะยังไม่ support
|
|
|
|
|
Date :
2012-05-28 12:47:25 |
By :
mr.win |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ความจริงใน link ที่ผมให้ไปก็มีวิธีตั้งค่า Font อยู่นะครับ ลองทำตามหรือยัง ตรงบันทัดนี้นะครับ
Code (PHP)
$section->addText('Hello world! I am formatted.', array('name'=>'Tahoma', 'size'=>16, 'bold'=>true));
ซึ่งผมไม่เห็นตรงนี้ในโค้ดของคุณ
ตรง $section นี้ต้องเปลี่ยนนะครับ เพราะของคุณคือ $PHPWord
|
|
|
|
|
Date :
2012-05-28 14:03:08 |
By :
Songkram |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ไม่แน่ใจว่าลองใช้ iconv เพื่อการ Convert string to requested character encoding หรือยังครับ สำหรับผมมันเป็นไม้ตายสุดท้ายเลยสำหรับการเปลี่ยน Encoding ของภาษาครับ .... ปกติผมจะเซตค่าทุกค่าในโปรแกรมให้ใช้ UTF-8 ทั้งหมดอยู่แล้วจึงไม่มีปัญหาเรื่องภาษาไทย แตุ่ถ้าเป็นโปรเจ็คที่รับช่วงต่อมา หรือช่วยแก้ไข ก็จะใช้ iconv สลับไป สลับมา ระหว่าง UTF-8 กับ TIS-620
ลองเข้าไปดูการใช้งานนะครับ..... http://php.net/manual/en/book.iconv.php
|
|
|
|
|
Date :
2012-05-28 14:17:25 |
By :
Songkram |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
งั้นถามต่อ ...
ใน MySQL คุณตั้งค่า character set ฐานข้อมูลเป็นอะไร
ในขั้นตอนการ Connection คุณตั้งค่าคิวรี่ (character_set) เป็นอะไร ตัวอย่างของผมก็คือ
Code (PHP)
@mysql_query("SET character_set_results='utf8'");
@mysql_query("SET character_set_client='utf8'");
@mysql_query("SET character_set_connection='utf8'");
@mysql_query("collation_connection = utf8_general_ci");
@mysql_query("collation_database = utf8_general_ci");
@mysql_query("collation_server = utf8_general_ci");
ตอนบันทึกไฟล์ ใช้ Encoding เป็น อะไร (ANSI หรือ UTF-8)
เอาแค่นี้ก่อน อย่างที่บอกปกติผมเซตเป็น UTF-8 ทั้งหมด เพราะฉะนั้นจึงไม่ค่อยมีปัญหาครับ
|
|
|
|
|
Date :
2012-05-28 14:36:20 |
By :
Songkram |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
เอาใจช่วยครับ
|
|
|
|
|
Date :
2012-05-28 14:43:59 |
By :
mr.win |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ก่อนหน้านี้ผมลองแล้วครับ ทั้ง iconv() ยังไม่ได้เหมือนกัน เลยไม่ได้ดูต่อเลย
|
|
|
|
|
Date :
2012-05-28 14:54:25 |
By :
mr.win |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
จากคำตอบ ผมว่าน่าจะเกือบได้คำตอบแล้วนะครับ ลองดูในทุกขั้นตอน ที่เกี่ยวกับการ Encoding ดูนะครับ ว่าตรงไหนบ้างที่ไม่เหมือนกัน ในบทความของบอร์ดนี้ก็มีนะครับเรื่องภาษาไทย
ปกติมันก็มี 2 อย่างคือ ในขั้นตอนบันทึกลงฐานข้อมูล กับ ขั้นตอนการเอาข้อมูลขึ้นมาแสดง ถ้าในระหว่างทางมันมีการเปลี่ยนแปลง Encoding ตรงไหน เราต้องทราบด้วย ในกรณีคุณ ติดตรงขั้นตอนการนำเอาข้อมูลขึ้นมาแสดง คือตั้งแต่การ Connection การคิวรี่ การ echo ข้อมูลขึ้นมาแสดง (หรืออาจจะจะเป็นในเรื่องของการ Save file )... เพราะฉะนั้นเราต้องดูว่าจุดไหนที่มีการเปลี่นแปลง Encoding ของข้อมูลเราบ้าง
ในที่นี้อาจจะเป็นแค่ตอน คิวรี่ก็ได้มั้งครับ ให้ลองเปลี่ยน Encoding ในขั้นตอนนี้ดูก่อนละกัน
ลองดูตรงนี้ประกอบนะครับ
https://www.thaicreate.com/community/php-mysql-thai.html
|
ประวัติการแก้ไข 2012-05-28 15:04:45
|
|
|
|
Date :
2012-05-28 15:04:11 |
By :
Songkram |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
เอ่อออ
แต่จากที่ผมลองทำการใส่ข้อมูลลงไปตรงๆโดยที่ไม่ได้ ดึงข้อมูลจาก Base มันก็แสดงออกมาเพี้ยนๆเหมือนกันนะครับ
ตัวอย่างเช่น
Code (PHP)
$document->setValue('Self', 'เทสข้อมูลภาษาไทย');
จากตัวอย่างด้านบนนี้ ผมได้ทำการใส่ข้อมูลลงไปใน Word แบบตรงๆโดยไม่ได้ Select จาก Base
ดังนั้นผมคาดว่าไม่น่าจะเกี่ยวกับการ Encoding จาก Base แล้ว
น่าจะอยู่ที่การ Save File หรือการแสดงผลภาษาไทยของ PHPWord แล้วหละครับ(ผมคาดว่าอย่างนั้นนะครับ...)
แต่ก็ยังหาไม่เจอว่ามันต้องไปแก้ตรงไหน...
|
|
|
|
|
Date :
2012-05-28 15:14:04 |
By :
MaTaDoRcpe |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ตอนใส่ข้อมูลเพื่อทดลองภาษาไทยใช้เครื่องมืออะไรครับ...
ถ้าใช้ Method ของการ setValue ตามตัวอย่างอาจจะยังไม่สามารถระบุคำตอบได้นะครับ เพราะมันก็อาจจะกลับมาที่ปัญหาเดิมก็คืออาจจะเป็นในเรื่องของการ Connection อีกนั่นแหละ เพราะ Class มันก็ใช้ connction ในการบันทึกข้อมูลจาก Connection เดียวกันกับตอนดึงข้อมูลมาแสดง
....
ยังไงลองกรอกข้อมูลโดยใช้มือกรอกลงไปตรงๆในฐานข้อมูลดูนะครับ เช่นกรอกใน phpMyAdmin หรือ Tool อื่นๆ.. เพื่อตรวจสอบการบันทึกข้อมูลดูก่อนว่าได้หรือไม่ ปกติผมใช้ Navicat ก็สะดวกดีนะครับ
|
|
|
|
|
Date :
2012-05-28 15:25:09 |
By :
Songkram |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ตรง setValue ที่ผมว่านี้ มันเป็น Function ของ PHPWord ที่เค้าเขียนมาเพื่อที่จะทำการนำข้อมูลไปใส่ใน File Template.docx นะครับ
ไม่ได้เกี่ยวกับ dataBase นะครับ...
File ที่ผม Download มาคือ (http://phpword.codeplex.com/)
มันจะมี Function setValue นี้อยู่อะครับ...
|
|
|
|
|
Date :
2012-05-28 15:37:17 |
By :
MaTaDoRcpe |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
สวัสดีครับทุกท่าน...
วันนี้ผมมีข่าวดีมาบอกว่า...
ผมได้อาจารย์ใจดีท่านหนึ่ง ซึ่งท่านเทพ PHP มาก
ผมได้นำเรื่อง PHPWord ที่เป็นปัญหาตามกระทู้ที่ผมตั้งไว้นี้ไปถามท่าน
ท่านก็เลยไขปัญหานี้จนกระจ่างแจ้ง
ผมจะสรุปแล้วนะครับว่าปัญหานี้มันเกิดขึ้นเพราะอะไร
ปัญหานี้มันเกิดเพราะว่าการ convert ภาษากลับไปกลับมาของ PHPWord เองนั้นแหละครับ
สิ่งที่ทุกคนควรทำถ้าต้องการใช้งาน PHPWord นี้โดยไม่ติดปัญหาอย่างผมคือ
ให้ไป comment ตรงไฟล์ Template.php ของ PHPWord บรรทัดที่ 88-90 ครับ
Code (PHP)
if(!is_array($replace)) {
$replace = utf8_encode($replace);
}
ตามด้านบนนี้ครับ...
เราก็สามารถแสดงภาษาไทยได้แล้วครับ
ความกระจ่างแจ้งครั้งนี้ผมขอยกความดีให้กับท่าน อาจารย์พงษ์สุรีย์ ลิ้มมณีวิจิตร แห่งมหาวิทยาลัยเทคโนโลยีมหานคร ครับ...
แล้วอีกท่านนึงที่ไม่เอ่ยถึงไม่ได้คือ อาจารย์ทรงพล รื่นสุข แห่งมหาวิทยาลัยเทนโนโลยีมหานครครับ.....
|
ประวัติการแก้ไข 2012-05-30 17:22:15 2012-05-30 17:53:14
|
|
|
|
Date :
2012-05-30 17:14:05 |
By :
MaTaDoRcpe |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
โย๊ว ขอลองดูแป๊บครับ
|
|
|
|
|
Date :
2012-05-30 17:17:53 |
By :
mr.win |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
อืม ได้แล้วจริง ๆ ครับ
แต่ปัญหาก็คือ utf8_encode มันมีอยู่หลาย method มาก ถ้าใช้ addText
Code (PHP)
// New portrait section
$section = $PHPWord->createSection();
// Add text elements
$section->addText("สวัสดีครับ!");
จะต้องไปแก้ไขที่ไฟล์ Section.php ตรง
Code (PHP)
public function addText($text, $styleFont = null, $styleParagraph = null) {
//$givenText = utf8_encode($text);
$givenText = ($text);
$text = new PHPWord_Section_Text($givenText, $styleFont, $styleParagraph);
$this->_elementCollection[] = $text;
return $text;
}
หรือไม่ก็ใช้ Edit Plus ค้นหาจากไฟล์แล้ว Remark ออกให้หมด
|
|
|
|
|
Date :
2012-05-30 17:38:40 |
By :
mr.win |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอบคุณเช่นเดียวกันสำหรับวิธีครับ
|
|
|
|
|
Date :
2012-05-31 11:59:12 |
By :
mr.win |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ผมขอถามหน่อยครับ
คือผมนำไปใช้แล้วได้จริง แต่จะออกรายงานแบบเป็นตารางแล้วในช่องต้องขึ้นบรรทัดใหม่แล้วย่อหน้าเข้าไป คือผมทำไม่ได้ครับ
|
|
|
|
|
Date :
2016-04-30 21:13:02 |
By :
นักศึกษา |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 05
|