Как настроить кодировки (UTF-8) для кода, выполняемого запланированными заданиями Quartz в веб-приложениях Spring Framework? - PullRequest
2 голосов
/ 20 мая 2010

Интересно, как настроить потоки запланированных заданий Quartz для отражения правильной кодировки. Код, который в противном случае выполняется нормально в загруженных веб-приложениях Springframework (java), получит проблемы с кодированием при запуске в потоках, запланированных кварцем.

Кто-нибудь может мне помочь? Весь исходный код компилируется с использованием maven2 с кодировкой источника и файла, настроенной как UTF-8.

В кварцевых нитях любая строка будет иметь ошибки кодирования, если она находится за пределами символов 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

Те же строки кода, выполняемые внутри bean-компонентов с инжекцией пружины, на которые ссылаются сервлеты в веб-контейнере, будут выводить правильную кодировку.

Что делает кодировку кварцевых нитей зависимой?

1 Ответ

3 голосов
/ 21 мая 2010

Я не видел шаблон √Ö√Ñ√ñ раньше.Это не вписывается в обычные паттерны неправильной работы с использованием любых известных мне кодировок 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.

Поскольку вы сказали, что он отлично работает при использовании в сервлетах и ​​что оба используют один и тот же приложение для ведения журнала, выходные данные журнала могут быть исключены изподозреваемого.Теперь я могу думать только об одной причине: файл с этими символами был сохранен с использованием римской кодировки Mac OS вместо UTF-8.Непонятно, какой редактор вы используете на Mac, но Notepad и Eclipse выдали бы предупреждающее сообщение об этом, и при повторном открытии файла в редакторе должны были отображаться те же некорректные символы.

Какой редактор вы используете?Это явно настроено для сохранения файлов с использованием кодировки UTF-8?


Обновление : поскольку это не является причиной проблемы, давайте вернемся к тому факту, что она работает нормально при использовании сервлетов.Как именно вы это проверили?Разве вы случайно не вводили эти символы, используя римскую кодировку Mac OS, чтобы они правильно отображались, когда регистратор все-таки, вероятно, настроен для использования Mac OS Roman?Куда ведет логгер?Командная консоль или лог-файл?Как они закодированы?Что детекторы кодирования говорят о кодировке файла?(извините, я не работаю с Mac, но Editplus / Notepad ++ в Windows, например, может обнаружить / автоматически определить кодировку файла и сообщить об этом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...