我正在尝试提交一个包含特殊字符的字段的表单,例如€ŠšŽžŒœŸ.据我所知,从
ISO-8859-15 wikipedia page开始,这些字符都包含在标准中.即使请求和响应的编码都设置为ISO-8859-15,当我尝试显示值时(在JAVA EE环境中使用FreeMarker 2.3.18),值为??????? .我已经将表单的接受字符集设置为ISO-8859-15,我已检查表单是否提交了内容类型text / html; charset = ISO-8859-15(使用firebug)但我无法弄清楚如何显示正确的字符.如果我运行以下代码,则显示正确的十六进制值(例如:Ÿ= 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();
最佳答案 根据十六进制值,表单数据正确提交.
问题似乎与输出有关. Java用一个字符替换?如果它不能用使用的charset表示.
构造输出流时必须使用正确的字符集.你用什么命令?我不知道FreeMarker但可能会有类似的东西
Writer out = new OutputStreamWriter(System.out);
这应该用类似的东西代替:
Writer out = new OutputStreamWriter(System.out, "iso-8859-15");
顺便说一下,UTF-8通常是编码字符集的更好选择.