gpt4 book ai didi

java - 如何为 Spring 框架 webapps 中 Quartz 计划作业执行的代码配置编码 (UTF-8)?

转载 作者:行者123 更新时间:2023-12-04 06:52:47 27 4
gpt4 key购买 nike

我想知道如何配置 Quartz 计划的作业线程以反射(reflect)正确的编码。否则在 Springframework 注入(inject)加载的 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>

示例实现
public class ExampleJob extends QuartzJobBean {

private Log log = LogFactory.getLog(ExampleJob.class);

protected void executeInternal(JobExecutionContext ctx) throws JobExecutionException {
log.info("ÅÄÖ");
log.info(Charset.defaultCharset());
}
}

示例输出
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 注入(inject) bean 中执行的相同代码行将输出正确的编码。

是什么让 Quartz 线程编码依赖?

最佳答案

我没看到√Ö√Ñ√ñ之前的图案。这不适合使用我知道的任何 ISO-8859 字符集的常见格式错误模式。由于您在其中一条评论中谈论的是 Mac OS Roman,因此我调查了 its codepage并得出结论,这种编码在某处被错误地使用。

字符串 ÅÄÖ由以下 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 , 0x840x96代表 Ö , Ññ分别在 Mac OS Roman 编码中。

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

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

更新 : 既然这似乎不是问题的原因,让我们回到使用 servlet 时它可以正常工作的事实。你到底是怎么测试的?您是否不小心使用 Mac OS Roman 编码输入了这些字符,以便在记录器可能配置为使用 Mac OS Roman 时正确结束?记录器记录到哪里?命令控制台还是日志文件?它们是如何编码的?编码检测器告诉文件编码什么? (对不起,我不做 Mac,但例如 Windows 中的 Editplus/Notepad++ 可以检测/自动猜测文件编码并告诉它)。

关于java - 如何为 Spring 框架 webapps 中 Quartz 计划作业执行的代码配置编码 (UTF-8)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2877233/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com