ColdFusion, документ MS Word и греческие символы

Я пытаюсь динамически создавать текстовые документы из базы данных (я использую CFC для обработки запросов). Мои усилия были успешными, но я могу воспроизводить документы только для английского языка. Тем не менее, мое приложение использует греческий язык.

Когда я пытаюсь создать документы, содержащие греческие символы, вывод выглядит так:??????????????????, Я перепробовал много вещей, но ничего не работает. Странная вещь здесь, когда я использую тот же CFC для воспроизведения PDF, греческие символы выводятся правильно.

The cfm file:

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

The cfc file:

<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>
 Leigh02 июн. 2012 г., 16:54
Как вы храните персонажей? Что такое тип данных столбца, сопоставление и тип БД?
 Leigh01 июн. 2012 г., 23:13
Если вы выводите значения в виде HTML, они отображаются правильно? Если нет а) хранятся ли данные в формате Unicode, то естьnvarchar? б) каковы ваши настройки источника данных (и тип базы данных)?
 anarchos7802 июн. 2012 г., 11:08
Затем я попробовал следующее: [ссылка] Pastebin.com / M5Q9P0rd С вышеуказанным кодом выводились только английские символы. Когда я закомментирую следующие строки: [code] <cfheader name = "Content-Disposition" value = "inline; filename = Save-Print.doc" charset = "utf-8"> <cfcontent type = "application / msword" > [/ code] все работает нормально. Я попробовал это также в Railo. Приведенный выше код работает нормально только при запросе 1 строки (греческие символы)! Я не могу понять, что происходит. Любые идеи приветствуются. Заранее спасибо, Том, Греция

Ответы на вопрос(2)

тьюhttp: //www.joelonsoftware.com/articles/Unicode.htm который отлично объясняет. В этом случае вы пошли на все, чтобы установить все в utf-8, что заставило бы меня понять, что то, что вы получаете от БД, не в Unicode, а в греческой кодовой странице. В качестве эксперимента вы можете попробовать установить кодировку в cfheader и тегах на ISO-8859-7 или Windows-1253. Это может правильно показать содержание. Вы также можете вынуть и открыть документ в IE. Есть меню View-> Encoding, которое позволяет изменить кодировку, используемую IE для отображения документа, который может показать, что на самом деле используется.

Закомментировав тег, я думаю, что вы позволяете браузеру выбирать тип контента, и он, вероятно, работает над тем, чтобы стать одним из греческих кодировок. Вы также можете попробовать использовать Стелька захватить и проверить ответ от CF. Если греческие символы действительно кодируются как utf-8, они будут занимать более 1 байта, тогда как если они находятся на греческой кодовой странице, они будут занимать только 1 байт. Использование шестнадцатеричного представления на вкладке ответа Fiddler должно показать вам это довольно быстро.

Другой вариант может заключаться в том, чтобы использовать что-то вроде Apache POI для создания файлов «реального» слова .doc или .docx. Это кусок работы, но мы используем его, чтобы хорошо работать там, где я работаю.

 barnyr02 июн. 2012 г., 15:59
Я бы все-таки взглянул на необработанный снимок через скрипач или проволочную акулу, чтобы быть на 100% уверенным в том, что отправляется. Кроме того, вы генерируете HTML, затем даете ему расширение .doc и используете тип содержимого, чтобы заставить его открыть его. Я думаю, что вы во власти того, как Word выбирает интерпретацию HTML, что может быть или не быть разумным. Вы можете попробовать преобразовать каждый символ в ссылку на символьную сущность в юникоде и посмотреть, правильно ли с этим справляется слово
 anarchos7802 июн. 2012 г., 14:22
Спасибо за ваш ответ. Проблема не в базе данных. Если вы перейдете по ссылке: [ссылка] Pastebin.com / M5Q9P0rd вы увидите, что я поместил данные в строку. Та же проблема возникает. Когда я удаляю <cfcontent type = "application / msword"> (это означает, что я не обслуживаю контент в формате doc), все отлично отображается в браузере. Но я не хочу отображать контент в браузере. Я хочу, чтобы пользователь загрузил его как документ.
Решение Вопроса

я тоже получил бред. Похоже, вы бросили<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>
...
 anarchos7802 июн. 2012 г., 19:35
Спасибо еще раз
 anarchos7802 июн. 2012 г., 18:31
Огромное спасибо. Можете ли вы объяснить, почему вышесказанное работает? Я не хочу только решение, но и объяснение. Таким образом, у меня есть шанс учиться. Еще раз спасибо, мой друг
 Leigh02 июн. 2012 г., 19:15
Это, очевидно, комбинация вещей, но ключевое отличие заключалось в добавлении обратно<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> тег на HTML. Если вы пропустите это, MS Word по умолчанию принимает значениеwindows-1252 для большинства

Ваш ответ на вопрос