2012-03-04 24 views
4

アクセント付きの文字をFreemarkerで印刷しようとしていますが、アクセント付きの文字の代わりに疑問符のみが表示されます。私は、次の文が成立することを、確認しました:Freemarkerエンコーディング - アクセント付き文字の代わりの疑問符

"UTF-8" == Environment.getCurrentEnvironment().getConfiguration().getDefaultEncoding() 

私は簡単にアクセント付き文字が正しくテンプレートにそれを与える前に、変数に保持されていることを、見ることができます。

マイFreeMarkerのコンテキストをここで見つけることができます。例えばhttps://gist.github.com/1975239

の代わり:

Jedine?ný ?ivý koncert, kde nejen, ?e usly?íte, ale i uvidíte splynutí metalové kapely s padesáti?lenným orchestrem v?etn?. 

感謝を:

Jedinečný živý koncert, kde nejen, že uslyšíte, ale i uvidíte splynutí metalové kapely s padesátičlenným orchestrem včetně. 

私は入れません。

答えて

1

FreeMarkerはテキストを常にUNICODEとして扱うため、疑問符は生成されません。アクセント付きの文字がテンプレートから来ていないので(私がそれをよく理解していれば)、あなたの出力エンコーディングは間違っているはずです。参照:http://freemarker.org/docs/app_faq.html#faq_questionmark

BTW、getDefaultEncoding()にはこれがありません。これはテンプレートを読み込むときに使用されるデコードに影響しますが、アクセント付きの文字はテンプレートファイルから来ていないと言っていますが、? -sをデコードから取得することはできません(無効なUTF-8バイトシーケンス)。 FreeMarkerは出力のエンコーディングとしてOutputStreamとは対照的にWriterを使用しているため、影響を受けることはできません。

+0

私はOutputStreamインスタンスを作成しませんが、これはSpringによって作成されたと思います。デバッグすると、org.apache.catalina.connector.CoyoteWriterが使用されているのがわかりますが、エンコーディングの参照が見つかりません。ありがとう –

+1

カタリナで使用される文字セットは、おそらく 'HttpServletResponse'の" characterEncoding "プロパティに依存します。ですから、あなたのMVCコントローラに 'response.setContentType(" text/html; charset = UTF-8 ");というようなものがあれば、それが解決するかもしれません。しかし、Springでエンコーディングを設定するのは適切な方法ではないかもしれません。 – ddekany

+0

ありがとう! HttpServletResponse.setCharacterEncoding()を使用してトリックを行った! –

0

freemarker servletには、テンプレートと出力をエンコードするためのinitパラメータがあります。あなたの設定と比較するかもしれません。

6

私はFreeMarkerViewResolverにコンテンツタイプを設定することにより、(™のような)非標準のシンボルと同様の問題を解決することができた:DROPWIZARDユーザー向け

<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> 
... 
    <property name="contentType" value="text/html;charset=UTF-8"/> 
... 
</bean> 
5

:でUTF-8文字セットを通過コンストラクタはうまくいきました:

import io.dropwizard.views.View; 

import java.nio.charset.Charset; 

public class SomeView extends View { 
    public SomeView() { 
     super("/views/some.ftl", Charset.forName("UTF-8")); 
    } 
} 
関連する問題