JSF和HTML表单的Unicode问题?

时间:2009-05-14 14:50:34

标签: java html unicode jsf

我有一个由JSF生成的HTML表单,它将输入元素映射到bean setter 并且在我看来,JSF在路上输入unicode输入。特别是我在setter中将以下异常用于测试目的

public void setTitle(String title){
    System.out.println("title set with: "+title+"\n");
    if (title.startsWith("xxx")) {
        throw new RuntimeException("debug exception "+title);
    }
    this.title = title;
}

然后我将以下文本放入表单标题输入元素:“xxxx海陆”。然后,当我提交表单时,我会看到日志打印

title set with: xxxx ????? 

(在兼容unicode的mac终端上)。 我在响应HTML页面上收到错误消息:

Error setting property 'title' in bean of type   
uk.ac.lancs.e_science.sakaiproject.api.blogger.post.Post: 
java.lang.RuntimeException: debug exception xxxx ���??

任何有关错误的线索?我只是满满的并且诊断错误了吗? 我想我已经淘汰了所有其他可能性。 Unicode似乎在同一应用程序的其他组件中工作正常。

2 个答案:

答案 0 :(得分:3)

我会问的问题:

  • 表单是如何编码请求的(application / x-www-form-urlencoded或multipart / form-data)?多部分数据将使用第三方MIME解析器进行解码,因此存在麻烦。如果数据是url编码的,它是否正确转义?
  • 浏览器accepting是什么字符集?
  • encoding is the server detecting是什么?它是Unicode字符集吗?
  • 只是记录为lossy encoding(例如MacRoman)?服务器使用的是什么default charset

由于您在控制台上看到的内容不一定是字符串中的内容,您可以使用以下代码转储Unicode code points

  public static void printCodepoints(char[] s) {
    for (int i = 0; i < s.length; i++) {
      int codePoint = Character.isHighSurrogate(s[i]) ? Character
          .toCodePoint(s[i], s[++i])
          : s[i];
      System.out.println(Integer.toHexString(codePoint));
    }
  }

答案 1 :(得分:0)

浏览器无法通过线路发送unicode;它必须以某种方式编码unicode。从异常的输出(两个汉字成为五个字符),我猜测数据被编码为UTF-8,并且在组件的服务器端接收后,字符串title未被正确解码。 / p>

我建议为表单设置accept-charset属性。这应该告诉每个人的行为。