1

データベースから Word 文書を動的に作成しようとしています (クエリ処理に CFC を使用しています)。私の努力は成功しましたが、英語のドキュメントしか複製できません。ただし、私のアプリはギリシャ語を使用しています。

ギリシャ文字を含むドキュメントを作成しようとすると、出力は次のようになります??????????????????。私は多くのことを試しましたが、何も機能していません。ここで奇妙なのは、PDF の複製に同じ CFC を使用している場合、ギリシャ文字が正しく出力されることです。

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>
4

2 に答える 2

1

あなたのペーストビンの例を試したとき、私も意味不明になりました。<meta>utf-8 を指定してタグを削除したようです。再度追加すると、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>
...
于 2012-06-02T14:57:46.967 に答える
0

文字セットの問題によく似ています。この記事を読んでください http://www.joelonsoftware.com/articles/Unicode.html物事を説明する素晴らしい仕事をしています. ただし、この場合、すべてを utf-8 に設定するのに苦労しました。これにより、DB から取得しているものはユニコードではなく、ギリシャ語のコードページであることがわかります。実験として、cfheader とタグの文字セットを ISO-8859-7 または Windows-1253 に設定してみてください。これにより、コンテンツが正しく表示される場合があります。IE でドキュメントを取り出して開くこともできます。View->Encoding メニューがあり、IE がドキュメントのレンダリングに使用するエンコーディングを変更できます。これにより、実際に使用されているものが表示される場合があります。

タグをコメントアウトすることで、ブラウザーにコンテンツタイプを決定させていると思います。おそらく、ギリシャ文字セットの1つになるように機能しています。fiddlerを使用して、CF からの応答をキャプチャして検査することもできます。ギリシャ文字が本当に utf-8 としてエンコードされている場合、それらは 1 バイト以上を占有しますが、ギリシャ文字のコードページにある場合は、1 バイトしか占有しません。フィドラーの応答タブで 16 進ビューを使用すると、これがすぐに表示されるはずです。

もう 1 つのオプションは、Apache POI などを使用して「実際の」単語 .doc または .docx ファイルを生成することです。かなりの作業ですが、私が働いている場所では効果的に使用しています。

于 2012-06-02T11:49:23.807 に答える