Java 如何为SpringFrameworkWebApps中Quartz调度作业执行的代码配置编码(UTF-8)?

Java 如何为SpringFrameworkWebApps中Quartz调度作业执行的代码配置编码(UTF-8)?,java,spring,utf-8,character-encoding,quartz-scheduler,Java,Spring,Utf 8,Character Encoding,Quartz Scheduler,我想知道如何配置Quartz调度的作业线程以反映正确的编码。在Springframework注入加载的webapps(java)中执行良好的代码在quartz安排的线程中运行时会出现编码问题 有人能帮我吗?所有源代码都使用maven2编译,源代码和文件编码配置为UTF-8 在quartz线程中,如果超出ISO 8859-1字符,则任何字符串都将有编码错误: 示例配置 <bean name="jobDetail" class="org.springframework.scheduling

我想知道如何配置Quartz调度的作业线程以反映正确的编码。在Springframework注入加载的webapps(java)中执行良好的代码在quartz安排的线程中运行时会出现编码问题

有人能帮我吗?所有源代码都使用maven2编译,源代码和文件编码配置为UTF-8

在quartz线程中,如果超出ISO 8859-1字符,则任何字符串都将有编码错误:

示例配置

  <bean name="jobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass" value="example.ExampleJob" />
  </bean>

  <bean id="jobTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
    <property name="jobDetail" ref="jobDetail" />
    <property name="startDelay" value="1000" />
    <property name="repeatCount" value="0" />
    <property name="repeatInterval" value="1" />
  </bean>

  <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
      <list>
        <ref bean="jobTrigger"/>
      </list>
    </property>
  </bean>
示例输出

2010-05-20 17:04:38,285  1342 INFO  [QuartzScheduler_Worker-9] ExampleJob - ÅÄÖ
2010-05-20 17:04:38,286  1343 INFO  [QuartzScheduler_Worker-9] ExampleJob - UTF-8
web容器中servlet引用的spring注入bean中执行的相同代码行将输出正确的编码


是什么使Quartz线程依赖于编码?

我还没有看到
ÅÄÖ
之前的模式。这不适合使用我所知道的任何ISO-8859字符集的常见错误模式。因为你在一篇评论中提到了Mac OS Roman,我调查并得出结论,这种编码在某些地方被错误地使用了

字符串
ÄÄÖ
由以下UTF-8字节组成:

String s = "ÅÄÖ";
for (byte b : s.getBytes("UTF-8")) {
    System.out.printf("0x%X ", b); // 0xC3 0x85 0xC3 0x84 0xC3 0x96 
}
代码页告诉我
0xC3
确实代表
0x85
0x84
0x96
分别代表Mac OS罗马编码中的
Ö
ñ
ñ

因为您告诉过它在servlet中使用时可以正常工作,并且两者都使用相同的日志追加器,所以可以排除日志输出的可疑性。我现在只能想到一个原因:带有这些字符的文件是使用Mac OS罗马编码而不是UTF-8保存的。目前还不清楚您在Mac上使用的是哪个编辑器,但记事本和Eclipse都会显示一条警告消息,并且在编辑器中重新打开文件时应该显示相同的错误字符

你在使用哪个编辑器?是否明确配置为使用UTF-8编码保存文件



更新:既然这似乎不是问题的原因,让我们回到使用servlet时工作正常的事实。你到底是怎么测试的?难道您没有意外地使用Mac OS Roman编码输入这些字符,以便在记录器最终可能配置为使用Mac OS Roman时正确结束吗?记录器记录到哪里?命令控制台还是日志文件?它们是如何编码的?关于文件编码,编码检测器说明了什么?(很抱歉,我不使用Mac,但windows中的Editplus/Notepad++可以检测/自动猜测文件编码并告知相关信息)。

您使用的是哪种日志框架?如果您使用的是Log4j,您确定两者使用相同的Appender配置吗?是的,日志配置相同。真正的应用程序实际上是对http请求的查询字符串进行url编码。我注意到非ascii字符的查询字符串非常奇怪,所以我进一步研究。首先我怀疑JVM默认的字符编码,但对于Windows-1252、MacRoman和UTF-8似乎是一样的。更改文件编码的tomcat选项也没有什么区别。它是log4j,但简单的System.out.println会输出相同的结果。文件保存在UTF-8中,平台编码不是问题。它将在任何平台/默认编码上输出相同的结果。该模式可以通过新字符串(“åäö”.getBytes(“UTF-8”)来纠正,但我希望保存的文件UTF-8编码能够反映在tomcat中的quartz线程和请求线程中。只有quartz无法识别编码。另一种观点认为quartz线程错误地解释了源文件:如果我使用数据库加载数据,它将具有正确的编码。有人对此有进一步的了解,或者重复我的问题吗?Eclipse是用UTF-8为该项目设置的。使用'file-I{file}'可以得到不同字符集的UTF-8的不同交叉字符集。因此,我认为我已经验证了eclipse输出UTF-8。记录器在两种上下文中的配置相同(相同的属性文件):log4j.appender.A1.Encoding=UTF-8I将提供一个更好的示例,这样我们就不会将自己与不相关的配置混淆:顺便说一句,如果我在Eclipse中运行代码,那么一切都正常,它只在Quartz中运行。
String s = "ÅÄÖ";
for (byte b : s.getBytes("UTF-8")) {
    System.out.printf("0x%X ", b); // 0xC3 0x85 0xC3 0x84 0xC3 0x96 
}