2015-08-25 2 views
4

Logback 1.1.3 LayoutWrappingEncoder documentation не указывает на то, что кодировка по умолчанию будет, если пользователь не устанавливает его, но исходный код говорит:Локальная кодировка по умолчанию для LayoutWrappingEncoder?

По умолчанию это свойство имеет нулевое значение, которое соответствует системная кодировка по умолчанию.

Однако я использую PatternLayoutEncoderRollingFileAppender), и это, кажется, вывода файлов в UTF-8 (и кодировкой по умолчанию моей Windows 7 Professional системы, вероятно, не UTF-8).

Выход UTF-8 на самом деле то, что я хочу, но я хочу убедиться, что я не получаю это случайно, поскольку документация, похоже, указывает на что-то еще. Итак, почему Logback дает мне выход UTF-8, если я не указал явно кодировку?

+0

Похоже, вы получаете это случайно. Я просмотрел исходный код и не смог найти классы, называющие setCharset в PatternLayoutEncoder. В документации указывается «кодировка кодировки, выбранная пользователем», что уже описано в [this] (http://stackoverflow.com/a/13841592/3080094). – vanOekel

+0

Но как это «случайно» работает? Я на компьютере с Windows --- откуда он получает UTF-8? Это должно произойти откуда-то. –

+0

Кодировка по умолчанию (используемая через 'getBytes()' в 'LayoutWrappingEncoder') - это [бит сложный] (http://stackoverflow.com/a/12659462/3080094), но [не тайна] (http: // superuser.com/a/879947). Ссылки могут помочь определить, откуда идет UTF-8? – vanOekel

ответ

6

Logback Кодировка символов

Вы можете использовать <charset> в определении вашего PatternLayoutEncoder, как это подкласс LayoutWrappingEncoder, который предоставляет метод setCharset. Это указывается в документации по выдержке из класса, но никакой конфигурации xml не указывается. Для LayoutWrappingEncoder ответ дан здесь: [Logback-user]: How to use UTF-8.

Таким образом, если вы настроите код, вы можете вызвать метод setCharset с UTF-8. Или, если вы настраиваете через XML это:

<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
     <charset>UTF-8</charset>    
     <outputPatternAsHeader>true</outputPatternAsHeader> 
     <pattern>[%thread] %-5level %logger{35} - %msg%n</pattern> 
</encoder> 

Кодировка по умолчанию файла

документация Logback верна в том, что используется кодировка символов по умолчанию. Набор символов по умолчанию, как правило, не UTF-8 для окон (например, шахта windows-1252). Правильная вещь, чтобы сделать это, настраивает logback как UTF-8, как указано выше. Даже если logback выбирает UTF-8 где-то, или file.encoding как-то устанавливается вами, нет никакой гарантии, что это произойдет в будущем.

Кстати ВС ранее говорил о file.encoding, если вы устанавливаете это на Oracle VM:

Свойство «file.encoding» не требуется спецификацией J2SE платформы; это внутренняя деталь реализаций Sun и не должна быть проверена или изменена кодом пользователя. Он также предназначен для чтения только для чтения; технически невозможно поддерживать настройку этого свойства на произвольные значения в командной строке или в любое другое время во время выполнения программы.

Затмение и Maven

Если вы работаете в Maven от затмения, и вы уже установили свою среду, чтобы быть UTF-8 или в для окружающей среды/проекта или конфигурации Run (для меня в общая вкладка), то затмение будет обеспечивать, чтобы новая JVM имела кодировку UTF-8, установив file.encoding. См: по умолчанию кодировка Eclipse's encoding documentation

0

системы определяется Java и установить в свойстве системы file.encoding, но это свойство также может быть определена как виртуальная машина запускается (более this answer).Eclipse, Netbeans, Maven и т. Д. Могут использовать это системное свойство для установки кодировки по умолчанию для UTF-8, и, вероятно, поэтому вывод находится в UTF-8, даже если вы не указали его.

Чтобы удалить элемент случайности, укажите набор символов для ведения журнала, как показано на рисунке this answer. Исходный код журнала показывает, как набор символов используется для преобразования строк в байты для записи в файл в методе convertToBytes (подробнее о строках в байтах объясняется в this answer).

В Unix, значение для file.encoding определяется с использованием переменных среды (например, с помощью LANG=en_US.UTF-8 как объяснено here, но и другие переменные окружения могут быть вовлечены as well).
В Windows кодовая страница по умолчанию отображается с помощью команды chcp. Номер кодовой страницы соответствует набору символов, указанному в this list. Например, кодовая страница 65001 соответствует UTF-8. Языковой стандарт по умолчанию показан командой systeminfo | findstr Locale.

Вкратце: как только ваше программное обеспечение покинет среду разработки, вы не можете принять какой-либо определенный набор символов по умолчанию. Поэтому всегда указывайте набор символов.

+0

Оба предоставленные ответы были хорошими. Выбирая щедрость, я должен был принять во внимание, что ангигавин дал первый ответ; он предоставил фактический код для решения моей проблемы вместо ссылки; и был первым, кто отметил, что моя настройка Eclipse + Maven может стать тем, что делает мою кодировку по умолчанию UTF-8. Я ценю ваши отзывы, и ваши заметки о 'getBytes()' были полезны. –

+2

@GarretWilson Это звучит справедливо. Кроме того, я узнал кое-что по пути, и это всегда хорошо. – vanOekel

Смежные вопросы