grails中文编码的再次挖掘

grails中文编码的再次挖掘
上次的gsp中文编码问题,我在grails的源码找到了问题的所在。
grails的gsp servlet程序是通过org.codehaus.groovy.grails.web.pages.GroovyPagesTemplateEngine对gsp进行编译和解释的,再此过程中同包下的Parse类负责了最基本的词法检查。但是Parse的readStream(InputStream in)读取gsp文件时,简单采用了ByteArrayOutputStream的toString()函数,这个函数只采用系统默认编码进行识别。也就是在这里产生了gsp依赖与操作系统默认编码集的问题。
既然如此,猜测有一个并不完美的解决方法:通过file.encoding系统属性来指定虚拟机的默认编码集。
比如:grails run-app -Dfile.encoding=GBK
结果又出乎我的意料,这样并不能工作,似乎是由于grails本身生成几个文件是UTF8编码的,强行指定GBK编码后会有问题。

看起来,如果你希望部署打包好的war程序包的话,没有好方法,只能选择编码集相同的环境!

我认为好的方法应该是grails支持在gsp的servlet配置中增加一个叫做fileEncoding的初始化参数,在读取文件时应用此参数。这样大家就可以根据自己的喜好选择开发grails的环境了。不过目前GroobyPagesServlet类与Parse类之间还隔了GroovyPagesTemplateEngine,并且这个GroovyPagesTemplateEngine的单例初始化是在其他地方完成的,要想实现这个参数比较繁琐。

或者要想简单的话就干脆写死Parse中使用UTF8,这也是个不错的选择,eclipse之类的开发工具对UTF8的支持很好,其他开发工具应该没有不支持UTF8的吧。这样就要求大家都是用UTF8编写gsp,反正文件中绝大多数都还是英文字符,也没多占几个字节。

如果上面的方法都不喜欢怎么办?我还有一个办法,就是不要在gsp中写ISO-8859-1字符以外的任何东西,使用i18n输出你期望的中文字符。其实也就是顺带着把网站所有资源国际化了,呵呵,一举两得。不过以我的体验来说,真要这样做的话,通常你是会抓狂的,properties文件将超出你想象的疯长,那个郁闷呀。
而且还要注意,虽然grails说可以配置在发布时把properties文件自动做native2ascii,但是现有会有类似的问题:原始的properties文件的native编码是什么?最好还是找个properties的编辑工具,直接保存成ascii的unicode转码比较好。

你可能感兴趣的:(grails中文编码的再次挖掘)