2012-06-01 139 views
1

我想從數據庫中動態構建word文檔(我正在使用CFC進行查詢處理)。我的努力是成功的,但我只能複製英語文檔。但是,我的應用程序使用希臘語。ColdFusion,MS Word文檔和希臘字符

當我嘗試構建包含希臘字符的文檔時,輸出如下所示:??????????????????。我嘗試了很多東西,但沒有任何工作。這裏奇怪的是,當我使用相同的CFC進行PDF複製時,希臘字符輸出正確。

的CFM文件:

<cfheader name="Content-Disposition" value="inline; filename=Save-Print.doc" charset="utf-8"> 
<cfcontent type="application/msword"> 

<html xmlns:o="urn:schemas-microsoft-com:office:office" 
     xmlns:w="urn:schemas-microsoft-com:office:word" 
     xmlns="http://www.w3.org/TR/REC-html40"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Print</title> 
<!--[if gte mso 9]> 
<xml> 
<w:WordDocument> 
<w:View>Print</w:View> 
<w:Compatibility> 
<w:UseAsianBreakRules/> 
</w:Compatibility> 
<w:Zoom>100</w:Zoom> 
<w:DoNotOptimizeForBrowser/> 
</w:WordDocument> 
</xml> 
<![endif]--> 

<!--[if supportFields]> 
<div style="mso-element:header" id="lala"> 
<p class=MsoHeader><span style="color:red"> 
<![endif]--> 
<style> 
<!-- 
@page Section1 
{ 
size:8.5in 11.0in; 
margin:1.0in 1.25in 1.0in 1.25in; 
mso-header-margin:.5in; 
mso-footer-margin:.5in; 
mso-paper-source:0; 
mso-header:url("http://localhost:8500/BookLedger_Final/resources/cfScripts/Header.html") h1; 
mso-footer:url("http://localhost:8500/BookLedger_Final/resources/cfScripts/Header.html") f1; 
} 
div.Section1 {page:Section1;} 
p.MsoHeader { 
border-bottom-width: 1px; 
border-bottom-style: solid; 
border-bottom-color: #333; 
} 
p.MsoFooter { 
} 
--> 
</style> 
</head> 

<body> 

<cfif not IsDefined("URL.id")> 
     <cfelseif not IsDefined("URL.model")> 
</cfif> 

    <!--- Get print details ---> 
    <cfinvoke 
    component="Print" 
    method="myPrint" 
    returnvariable="getMember" 
    id="#URL.id#" 
    model="#URL.model#"> 


    <div class=Section1> 

     <cfoutput query="getMember"> 
     <b id="lala">#Title#</b> 
     <p style="color:##1c1c1c"><i>#Body#</i></p> 
     </cfoutput>  

    </div> 


</body> 
</html> 

的CFC文件:

<cfcomponent> 

    <cffunction name="myPrint" access="remote" returntype="query" output="no"> 

     <cfargument name="id" default="0" required="false" type="numeric"> 
     <cfargument name="model" default="" required="false" type="any"> 
     <cfset model = #ARGUMENTS.model#> 

     <cfif model EQ "member"> 

     <cfquery name="getMember" datasource="rental">    
      SELECT CONCAT(rental.members.firstname,' ',rental.members.lastname) AS 'Title',rental.members.biog AS 'Body' 
      FROM rental.members 
      WHERE rental.members.id = #ARGUMENTS.id# 
      AND rental.members.model = "#ARGUMENTS.model#" 
     </cfquery> 


     <!---<cfset queryToString = serializeJson(getMember)> 
     <cfset strippedQuery = REReplace(queryToString,'<[^>]*>','','all')>---> 

     <cfreturn getMember> 



     <cfelseif model EQ "new_member"> 

     <cfquery name="getMember" datasource="rental">    
      SELECT CONCAT(rental.new_members.firstname,' ',rental.new_members.lastname) AS 'Title',rental.new_members.biog AS 'Body' 
      FROM rental.new_members 
      WHERE rental.new_members.id = #ARGUMENTS.id# 
      AND rental.new_members.model = "#ARGUMENTS.model#" 
     </cfquery> 

     <cfreturn getMember> 


     <cfelseif model EQ "book"> 

     <cfquery name="getMember" datasource="rental">    
      SELECT rental.books.title AS 'Title',rental.books.description AS 'Body' 
      FROM rental.books 
      WHERE rental.books.id = #ARGUMENTS.id# 
      AND rental.books.model = "#ARGUMENTS.model#" 
     </cfquery> 

     <cfreturn getMember> 


     <cfelseif model EQ "journal"> 

     <cfquery name="getMember" datasource="rental">    
      SELECT rental.journals.title AS 'Title',rental.journals.description AS 'Body' 
      FROM rental.journals 
      WHERE rental.journals.id = #ARGUMENTS.id# 
      AND rental.journals.model = "#ARGUMENTS.model#" 
     </cfquery> 

     <cfreturn getMember> 


     <cfelseif model EQ "cd"> 

     <cfquery name="getMember" datasource="rental">    
      SELECT rental.cd.title AS 'Title',rental.cd.description AS 'Body' 
      FROM rental.cd 
      WHERE rental.cd.id = #ARGUMENTS.id# 
      AND rental.cd.model = "#ARGUMENTS.model#" 
     </cfquery> 

     <cfreturn getMember> 

     </cfif> 

    </cffunction> 

</cfcomponent> 
+0

如果將值作爲html輸出,它們是否正確顯示?如果不是a)是以unicode存儲的數據,即'nvarchar'? b)你的數據源設置(和db類型)是什麼? – Leigh

+0

然後我嘗試了以下內容:[鏈接] http://pastebin.com/M5Q9P0rd使用上面的代碼只輸出英文字符。當我註釋掉下列行: [code] [/ code] 一切工作正常。 我在Railo也試過了。只有當我查詢1行(希臘字符)時,上述代碼才能正常工作!我無法弄清楚發生了什麼事。 歡迎任何想法。 謝謝你, 湯姆希臘 – anarchos78

+0

你如何存儲的字符?什麼是列數據類型,排序規則和數據庫類型? – Leigh

回答

1

當我嘗試你的pastebin例子時,我也得到了胡言亂語。看起來你放棄了指定utf-8的<meta>標記。當我將它添加回來時,字符在MS Word中正確顯示。

<cfprocessingdirective pageencoding="utf-8"> 
<cfheader name="Content-Disposition" value="inline; filename=Save-Print.doc" charset="utf-8"> 
<cfcontent type="application/msword; charset=utf-8"> 
<html xmlns:o="urn:schemas-microsoft-com:office:office" 
     xmlns:w="urn:schemas-microsoft-com:office:word" 
     xmlns="http://www.w3.org/TR/REC-html40"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
<title>Print</title> 
... 
+0

非常感謝。你能解釋爲什麼上述工作?我不想只有解決方案,但也有解釋。通過這種方式我有機會學習。再次感謝我的朋友 – anarchos78

+1

這是一個明顯的組合,但關鍵的區別在於加入了'tag到html。如果你忽略這個,MS Word會默認爲'windows-1252'。 – Leigh

+0

再次感謝您 – anarchos78

0

聽起來很像一個字符集問題。通過閱讀這篇文章http://www.joelonsoftware.com/articles/Unicode.html哪些做了很好的解釋事情。但是,在這種情況下,你已經盡力將所有內容都設置爲utf-8,這將使我從數據庫獲得的內容不是unicode,而是希臘代碼頁。作爲一個實驗,您可以嘗試將cfheader和tags中的charset設置爲ISO-8859-7或Windows-1253。這可能會正確顯示內容。您也可以取出並在IE中打開文檔。有一個View-> Encoding菜單,它允許你改變IE用來渲染文件的編碼,這個文件可能會顯示正在使用的文件。

通過評論標籤,我認爲你讓瀏覽器決定內容類型,它可能是一個希臘字符集。您也可以嘗試使用fiddler來捕獲和檢查來自CF的響應。如果希臘字符真正被編碼爲utf-8,它們將佔用超過1個字節,而如果它們在希臘代碼頁中,則它們將只佔用1個字節。在提琴手的響應選項卡中使用十六進制視圖應該很快顯示您。

另一種選擇可能是使用類似Apache POI的東西來生成'真正'的單詞.doc或.docx文件。這是一大塊工作,但我們在工作的地方使用它來產生良好效果。

+0

謝謝你的回覆。問題不在數據庫中。如果你按照下面的鏈接:[鏈接] http:// pastebin。com/M5Q9P0rd,你會看到我已經將數據放入了內聯。發生同樣的問題。當我刪除(表示我沒有以doc格式提供內容)時,瀏覽器中的所有內容都顯示正常。但我不想在瀏覽器中顯示內容。我希望用戶將其作爲文檔下載。 – anarchos78

+0

我仍然會看看通過提琴手或wireshark的原始捕捉,以100%確定發送的內容。此外,您正在生成HTML,然後給它一個.doc擴展名,並使用內容類型強制單詞打開它。我認爲你對Word如何選擇解釋HTML有所幫助,這可能是也可能不是明智的。你可以嘗試將每個字符轉換爲它的unicode字符實體引用,並查看單詞是否正確處理 – barnyr