2012-06-01 93 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