Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自由标记编码混乱_Java_Character Encoding_Freemarker - Fatal编程技术网

Java 自由标记编码混乱

Java 自由标记编码混乱,java,character-encoding,freemarker,Java,Character Encoding,Freemarker,当我读取带有FreeMarker的UTF-8编码模板时,特殊字符会在浏览器中正确呈现,尽管freeMarkerConfig.getDefaultEncoding()返回“Cp1252”。如果我设置了freeMarkerConfig.setDefaultEncoding(“UTF-8”),我在浏览器中只看到问号,尽管“UTF-8”是模板文件的实际编码。在每种情况下,都会发送http头“Content-Type:text/html;charset=UTF-8” 知道怎么回事吗?输出编码是java机器

当我读取带有FreeMarker的UTF-8编码模板时,特殊字符会在浏览器中正确呈现,尽管
freeMarkerConfig.getDefaultEncoding()
返回“Cp1252”。如果我设置了
freeMarkerConfig.setDefaultEncoding(“UTF-8”)
,我在浏览器中只看到问号,尽管“UTF-8”是模板文件的实际编码。在每种情况下,都会发送http头“Content-Type:text/html;charset=UTF-8”


知道怎么回事吗?

输出编码是java机器的编码。如果使用UTF-FOO创建输出文件,并将此输出文件传递给freemarker generation,则输出编码将为UTF-FOO

使用ex.代码:

  Template templévénmts;
  BufferedWriter writ;
  OutputStreamWriter encodé;

  encodé = new OutputStreamWriter(
   new FileOutputStream(new File(f_dirDestination, résultat)), "UTF-8");
  writ = new BufferedWriter(
   encodé);
  templévénmts = f_freemarker.getTemplate(modèle);
  templévénmts.process(f_rootDatas, writ);
  writ.close();

您也可以在中使用。

好吧,不管您认为您的输入是UTF-8编码的,实际上它确实是Cp1252编码的。你能用十六进制编辑器进行双重检查吗。我同意Istao的意见--尝试将模板文件处理为本地文件并检查结果。

将content type属性设置为FreeMarkerViewSolver

Spring 4.2示例
如果您使用spring框架和MIMessage发送电子邮件,请尝试通过MIMessagePreparator设置内容,如下所示(我跳过MIMessagePreparator方法getMessagePreparator,因为重要的是如何设置内容):

这对我很有效,浏览器在发送电子邮件时正确显示字符

隐含的类别包括:

import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;
import javax.mail.internet.MimeMessage;
另外,如果您使用的是EclipseIDE,请右键单击模板文件的属性,确保您的工作区具有模板文件的默认UTF-8编码


希望这有帮助。

setDefaultEncoding
是关于输入的编码。输入是UTF-8编码的,我告诉FreeMarker它将是UTF-8编码的,但它只有在Cp1252编码用于读取输入时才起作用。您的FreeMarker版本是什么,您在什么环境下使用它?我将FreeMarker 2.3.16与JAX-RS(实现:Jersey)一起使用,最后,Servlets。如果您将所有输入方式设置为UTF-8,并使用UTF-8设置将模板处理为本地系统上的文件,结果文件是否正确?我这样做了。我将所有输出和默认字符集设置为utf-8。我用utf-8阅读模板。我将输出处理为utf-8。将结果写入磁盘并获得cp1252(在windows系统上)。当我设置-Dfile.encoding=utf-8时,一切都很好。freemarker实现中的file.encoding在哪里?我已经用jEdit检查了编码,它可以很好地处理编码。有趣的是,它甚至可以在默认编码为UTF-8的系统上使用相同的模板文件。所以FreeMarker应该使用UTF-8来读取输入文件。2年后,当前版本和我有同样的问题。我没有用弹簧。我只是用freemarker生成输出。将模板编码设置为utf-8,将默认编码设置为utf-8,将输出编码设置为utf-8没有帮助。知道吗?你检查过模板文件的编码了吗?我的意思是,如果你在记事本++这样的文本编辑器中打开模板,并将编码设置为utf-8,你会看到正确的字符吗?如果问题与创建模板时使用的字符集无关,则模板的编码为utf-8。所有设置(模板编码、输出编码)也是utf-8。但是处理结果总是使用-Dfile.encoding=xxx给出的编码,windows系统上的默认值是Cp1252。我的应用程序正在wildfly 10中运行。我用的是freemarker 2.3.28。也许这很有趣。我发现了我的错误。我使用OutputStreamWriter包装传入的OutputStream,而没有将编码设置为freemarker的输出编码。默认编码是Cp1252或我使用-Dfile.encoding设置的任何内容。没有免费标记的问题!!即使这与本文中的问题无关,但在IDE中强制使用utf-8作为默认文件编码是避免此类错误的一种好做法,这样您就可以看到文件编码是否正确。
// Create the message helper from the received mimemessage on the preparator
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
// ... include the from, to, subject, freemarker html generation here... text is the String variable with generated html
// Set the content as follows instead of helper.setText(text, true);
helper.getMimeMessage().setContent(text, "text/html;charset=utf-8");
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;
import javax.mail.internet.MimeMessage;