024_输入输出字符集
1. 像其它大多數(shù)的Java應(yīng)用程序一樣, FreeMarker使用"UNICODE文本"(UTF-16)來(lái)工作。不過(guò), 也有必須處理字符集的情況, 因?yàn)樗坏貌缓屯饨缃粨Q數(shù)據(jù), 這就會(huì)使用到很多字符集。
2. 輸入的字符集
2.1. 當(dāng)FreeMarker要加載模板文件(或沒(méi)有解析的文本文件)時(shí), 那就必須要知道文件使用的字符集??梢允褂胑ncoding配置來(lái)確定字符集。這個(gè)配置項(xiàng)只在FreeMarker使用Configuration對(duì)象的getTemplate方法加載模板(解析過(guò)的或沒(méi)有解析過(guò)的)時(shí)起作用。請(qǐng)注意include指令在內(nèi)部也使用了這個(gè)方法。
2.2. encoding配置的getter和setter方法在第一個(gè)(配置)層面很特殊。getter方法猜想返回值是基于Locale(本地化)傳遞的參數(shù); 它在地圖區(qū)域編碼表(稱為編碼地圖)中查詢編碼, 如果沒(méi)有找到該區(qū)域, 就返回默認(rèn)編碼??梢允褂门渲脤?duì)象的setEncoding(Locale locale, String encoding)方法來(lái)填充編碼表; 編碼表初始化時(shí)是空的。默認(rèn)的初始編碼是系統(tǒng)屬性file.encoding的值, 但是可以通過(guò)setDefaultEncoding方法來(lái)設(shè)置一個(gè)不同的默認(rèn)值, 而不是依賴它。對(duì)于新項(xiàng)目來(lái)說(shuō), 默認(rèn)的編碼設(shè)置就是utf-8。
2.3. 也可以在運(yùn)行環(huán)境層直接給定值來(lái)覆蓋encoding的設(shè)置。
2.4. 也可以在模板文件中使用ftl指令, 比如: <#ftl encoding="utf-8">來(lái)指定特定的字符集。
2.5. 請(qǐng)注意, 模板使用的字符集和模板生成的輸出內(nèi)容的字符集是獨(dú)立的。
3. 輸出的字符集
3.1. 原則上, FreeMarker不處理輸出內(nèi)容的字符集問(wèn)題, 因?yàn)镕reeMarker將輸出內(nèi)容都寫(xiě)入了java.io.Writer對(duì)象中。而Writer對(duì)象是由封裝了FreeMarker(比如Web應(yīng)用框架)的軟件生成的, 那么輸出內(nèi)容的字符集就是由封裝軟件來(lái)控制的。
3.2. 而FreeMarker有一個(gè)稱為output_encoding的設(shè)置。封裝軟件應(yīng)該使用這個(gè)設(shè)置(Writer對(duì)象使用的字符集)來(lái)通知FreeMarker在輸出中(否則FreeMarker不能找到它)使用哪種字符集。
3.3. 有一些新的特性, 如內(nèi)建函數(shù)url, 特殊變量output_encoding也利用這個(gè)信息。因此, 如果封裝軟件沒(méi)有設(shè)置字符集這個(gè)信息, 那么FreeMarker需要知道輸出字符集的特性就不能被利用了。
3.4. 如果你使用FreeMarker來(lái)編寫(xiě)軟件, 你也許想知道在輸出內(nèi)容中到底選擇了哪種字符集。當(dāng)然這取決于運(yùn)行FreeMarker輸出內(nèi)容的計(jì)算機(jī)本身, 但是如果用戶對(duì)這個(gè)問(wèn)題可以變通, 那么通用的實(shí)踐是使用模板文件的字符集作為輸出的字符集, 或者使用UTF-8。通常使用UTF-8是最佳的實(shí)踐。
總結(jié)
以上是生活随笔為你收集整理的024_输入输出字符集的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 023_运行时变量和范围
- 下一篇: 051_元素之间空白间隙解决方案