Re: [請益] PHP 產生 RTF
※ 引述《Clessin (Clemond)》之銘言:
: ※ 引述《chaoms (小企鵝)》之銘言:
: : 觀念你先釐清一下!因為看你敘述後~問題點應該不在編碼~而是在程式
: : rtf檔頭有定義codepage,由你敘述應該確定就是cpg950
: : 那麼內容編碼就是要符合cp950的編碼規範,如果有unicode就須用\uXXXXX?格式
: : 這個觀念和HTML使用charset設big-5時顯示unicode就需用&#XXXXX;格式一樣
: : 再來header的charset也可能會影響讀取軟體判別語系...
: : 像你用cp950...header的charset應該用big-5才對..
: : 另外你有寫output buffering 你知道這個意義在哪裡嗎?
: : 意思就是你程式有bom的話再輸出這個rtf檔案格式根本就錯了..
: : 目前你提供的資訊大概只能猜常發生狀況就這些...
: : 至於你寫的程式是否有真的符合我提到的編碼~那只能當作你編碼有做到!
: : 先用cli將轉換過後的rtf存成檔案開啟看看,先確認檔案正常,
: : 再來判斷透過http時,因為加了什麼東西造成檔案開啟毀損?
: 感謝企鵝大的指導,看來我的觀念實在須要再加強,也感謝企鵝大指點了一條加強
: 的方向.沒錯,這個程式讀進來的樣板rtf檔的確是cpg950,我也照著企鵝大上一篇
: 的指引將utf-8編碼的中文(從mysql撈出來的)轉成\uXXXXX?格式.
: header的charset我也設成big5,但使用者下載回來的檔案就是顯示檔案毀損,
: 無法開啟.我將讀檔,代換,Output buffer給使用者的code,貼在下方,
: 希望企鵝大有空的時候看一下,指點一下問題在那裏,感謝!
: <?php
: mysql_query("SET NAMES 'utf8'");
: $result = mysql_query("select * from mytable where sn = '1'");
: $row = mysql_fetch_object($result);
: $title = $row->title;
: $content = file_get_contents("test.rtf");
: $title = str_replace(array("&", "#", ";"), array("\\", "u", "?"),
: mb_convert_encoding($title, "HTML-ENTITIES", "UTF-8"));
: $content = str_replace( "<<title>>", $title, $content );
: header('Content-Type: text/richtext;charset=big5');
: header('Content-Disposition: attachment; filename=download.rtf');
: header('Content-Transfer-Encoding: binary');
: header('Expires: 0');
: header('Cache-Control: must-revalidate');
: header('Pragma: public');
: ob_clean();
: flush();
: echo $content;
: exit;
: ?>
這樣好了~你寫兩個檔案
第一個檔案是下載HTML
<a href=1.php>PHP FILE</a>
<a href=download.rtf>RTF FILE</test>
第二個檔案是產生RTF的這隻程式
<?php
$title = "我愛台灣";
$content = file_get_contents("test.rtf");
$title = str_replace(array("&", "#", ";"), array("\\", "u", "?"),
mb_convert_encoding($title, "HTML-ENTITIES", "UTF-8"));
$content = str_replace( "<<title>>", $title, $content );
header('Content-Type: text/richtext;charset=big5');
header('Content-Disposition: attachment; filename=download.rtf');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
ob_clean();
flush();
echo $content;
file_put_contents("download.rtf", $content);
exit;
?>
然後先點第一個連結,就是透過HTTP傳輸後,看看你PHP有沒有多輸出處理什麼..
第二個連結就很單純的是你程式產生的RTF檔,由你的web server丟出的..
如果第二個檔案有問題,就是編碼問題.
如果第一個檔案有問題,就是php程式問題
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 101.13.15.59
討論串 (同標題文章)