FreeMarker 特殊字符输出为问号

Posted

技术标签:

【中文标题】FreeMarker 特殊字符输出为问号【英文标题】:FreeMarker special character output as question mark 【发布时间】:2014-07-30 23:17:21 【问题描述】:

我正在尝试提交包含特殊字符字段的表单,例如€ŠšŽžŒœŸ。据我从ISO-8859-15 wikipedia page 看到的,这些字符都包含在标准中。即使请求和响应的编码都设置为 ISO-8859-15,但当我尝试显示值(在 JAVA EE 环境中使用 FreeMarker 2.3.18)时,值是???????。我已将表单接受的字符集设置为ISO-8859-15,我检查了表单是否以内容类型text/html;charset=ISO-8859-15(使用萤火虫)提交,但我不知道如何显示正确的字符。如果我正在运行以下代码,则会显示正确的十六进制值(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();

【问题讨论】:

我有一个 freemarker/spring/tomcat 环境。我的显示一个问号并作为问号通过网络发送,但是,我已将 FM 设置为首先输出到 StringWriter,此时原始字符仍然是 Ÿ,所以我的猜测是问题出现在 FM 之后已处理输出。 【参考方案1】:

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

在构建输出流时,您必须使用正确的字符集。你为此使用什么命令?我不知道 FreeMarker,但可能会有类似的东西

Writer out = new OutputStreamWriter(System.out);

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

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

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

【讨论】:

我已经尝试在一个小项目中使用它并且它有效。没有指定编码。谢谢!

以上是关于FreeMarker 特殊字符输出为问号的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Facebook 帖子中的特殊字符显示为问号?

UTF-8 中的特殊字符在 MYSQL 中使用 magento 存储为带问号的菱形

SQL 的特殊字符显示为 ?在 HTML 中

显示带有问号的菱形等特殊字符的网站

使用转义字符输出正确的网址

Freemarker 编码 - 用问号代替重音字符