FreeMarker特殊字符输出为问号

时间:2014-06-10 08:59:05

标签: java encoding character-encoding freemarker iso-8859-15

我正在尝试提交包含特殊字符的字段的表单,例如€ŠšŽžŒœŸ。据我所知ISO-8859-15 wikipedia page,这些字符包含在标准中。即使请求和响应的编码设置为ISO-8859-15,当我尝试显示值时(在JAVA EE环境中使用FreeMarker 2.3.18),值为???????。我已将表单的已接受字符集设置为ISO-8859-15,我已检查表单是否已使用内容类型text/html;charset=ISO-8859-15(使用firebug)提交但我无法弄清楚如何显示正确的字符。如果我运行以下代码,则会显示正确的十六进制值(ex: Ÿ = be)

我错过了什么?提前谢谢!

System.out.println(Integer.toHexString(myString.charAt(i)));

修改

我在处理请求时遇到以下代码:

PrintStream ps = new PrintStream(System.out, true, "ISO-8859-15");
String firstName = request.getParameter("firstName");

// check for null before
for (int i = 0; i < firstName.length(); i++) {
     ps.println(firstName.charAt(i)); // prints "?"
}

BufferedWriter file=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path), "ISO-8859-15"));
file.write(firstName); // writes "?" to file (checked with notepad++, correct encoding set) 
file.close();

1 个答案:

答案 0 :(得分:2)

根据十六进制值,正确提交表单数据。 问题似乎与输出有关。如果字符无法用正在使用的字符集表示,则Java会将字符替换为?

构造输出流时必须使用正确的字符集。你用什么命令?我不知道FreeMarker,但可能会有像

这样的东西
Writer out = new OutputStreamWriter(System.out);

这应该用类似的东西代替:

Writer out = new OutputStreamWriter(System.out, "iso-8859-15");

顺便说一句,UTF-8通常是编码字符集的更好选择。