2012-03-04 32 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

順便說一下,getDefaultEncoding()在這方面沒有任何作用。這會影響加載模板時使用的解碼,但是您說重音字符不是來自模板文件,我也不認爲您可以從解碼中獲得? -s(除非對於無效的UTF-8字節序列)。至於輸出的編碼,FreeMarker只使用Writer(而不是OutputStream),所以它不會影響這一點。

+0

謝謝,這更有意義了,但我沒有創建OutputStream的情況下,我想這是由Spring創建。在調試時,我可以看到它使用org.apache.catalina.connector.CoyoteWriter,但我找不到任何對它的編碼的參考。謝謝 – 2012-03-05 17:20:52

+1

Catalina使用的字符集肯定取決於「HttpServletResponse」的「characterEncoding」屬性。所以如果你在MVC控制器中有'response.setContentType(「text/html; charset = UTF-8」);'''''',那可能會解決它。但是,這可能不是在Spring中設置編碼的正確方法。 – ddekany 2012-03-06 22:34:04

+0

好的,謝謝!使用HttpServletResponse.setCharacterEncoding()做了詭計! – 2012-03-06 23:56:44

0

對於freemarker servlet,存在用於編碼模板和輸出的初始參數。您可以將其與您的配置進行比較。

6

我能夠在FreeMarkerViewResolver設置內容類型來解決類似的問題非標準的符號(如™):

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

對於DROPWIZARD用戶:通過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")); 
    } 
}