2009年4月9日星期四

Google App Engine for Java的JSP中文问题

现象:直接使用java-sdk上传或使用eclipse上传后发现JSP中的中文是乱码的,Servlet在设置好request和respone的encoding后处理中文没有问题。

在使用命令行方式上传中文的JSP时,我发现有一个JSP报错如下:
--------------------------------------
8% Compiling jsp files.
2009-4-10 8:43:16 org.apache.jasper.JspC processFile
信息: Built File: \a.jsp
11% Compiling java files.
C:\DOCUME~1\keel\LOCALS~1\Temp\appcfg53496.tmp\WEB-INF\classes\org\apache\jsp\a_
jsp.java:43: 警告:编码 GB18030 的不可映射字符
out.write("...head>\r\n meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\r\ntitle>鎴戞潵浜??/title>\r\nhead>\r\nbody>\r\n");
1 警告
--------------------------------------
(因为blog发表的要求,部分html代码作了改动)

这说明在使用org.apache.jasper.JspC processFile进行Compiling jsp files使用了GB18030而不是UTF-8,而且在生成的临时文件夹中可以看到jsp编译后的.java文件直接就是乱码的,所以,并不是googleApp的server不支持,而是appengine-java-sdk的JSP编译器的编码有问题。对于这个问题,我在googleApp for java的groups上提问了,参考:How to change the JspCompiler's encoding

sdk的上传参数很简单,再看了文档,好像在builder.xml中可以通过ant进行一些设定,但涉及到update操作时还是没有办法。

再经过对appengine-java-sdk一番研究,发现居然没有地方可以设置JSP编码选项(在appengine-local-runtime.jar(lib/impl)中com\google\appengine\tools\development\webdeafault.xml 中可以加上javaEncoding,但没有用),而且这个java的sdk似乎没有源文件下载,也就无法从根本上解决这个问题(反编译?没必要吧),不过相信过不了多久,SDK的源码发布后就可以解决这个问题,或者GOOGLE自己会加上这个参数设置就更好了。

后来发现jxva回了我的帖子,并给出了JSP中文的解决办法,对JSP中的中文进行转码,就像我们以前在处理WAP的中文问题一样,他给出了一个方法:
-----------------------------------
public static String encode(String str) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < c =" str.charAt(i);" a =" (char)"> 255) {
sb.append("&#").append(a).append(';');
} else {
sb.append(c);
}
}
return sb.toString();
}
-----------------------------------
效果可以看他的app:http://jxva-framework.appspot.com/

这种方法可以暂时解决JSP的中文问题,甚至可以写一个ant脚本对JSP进行预处理,目前也只有如此了。此外,把windows的默认编码设置为utf-8应该也能起作用,如果有办法改的话。

相关主题:

1 条评论:

  1. public static String encode(String str) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < c =" str.charAt(i);" a =" (char)"> 255) {
    sb.append("&#").append(a).append(';');
    } else {
    sb.append(c);
    }
    }
    return sb.toString();
    }

    这段代码是jsp的不?

    回复删除