Logback字符编码
你可以在PatternLayoutEncoder
的定义中使用<charset>
,因为它是LayoutWrappingEncoder
的子类,后者提供了setCharset
方法。文档中的某个片段指出了这一点,但没有给出示例xml配置。关于LayoutWrappingEncoder,这里已经给出了答案:[Logback-user]: 如何使用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文档中指出使用默认字符编码是正确的。在Windows上,默认字符集通常不是UTF-8(例如我的是windows-1252
)。正确的做法是像上面那样配置logback为UTF-8。即使logback从某个地方选择了UTF-8,或者file.encoding
被您设置了,也不能保证这将来会发生。
顺便提一下,Sun曾经关于file.encoding
说过,在Oracle VM上设置它:
"file.encoding"属性不是J2SE平台规范所必需的;它是Sun实现的内部细节,不应由用户代码检查或修改。它也旨在为只读;从技术上讲,在命令行或任何其他时间对该属性设置任意值都是不可能的。
Eclipse和Maven
如果您正在从Eclipse运行maven,并且已经在环境/项目或运行配置(对我来说是公共选项卡)中将其设置为UTF-8,则Eclipse将通过设置file.encoding
来安排新的JVM具有UTF-8编码。请参阅:Eclipse的编码文档
file.encoding
中设置,但也可以在JVM启动时指定该属性(更多信息请参见此答案)。 Eclipse、Netbeans、Maven等可以使用此系统属性将默认字符集设置为UTF-8,这可能就是为什么输出是UTF-8,即使您没有指定它。file.encoding
的值使用环境变量确定(例如通过LANG=en_US.UTF-8
来解释,如此处所述,但其他环境变量也可能会涉及到)。
chcp
显示默认代码页。代码页编号与此列表中显示的字符集对应。例如,代码页65001对应于UTF-8。使用命令systeminfo | findstr Locale
显示默认区域设置。getBytes()
的注释是有帮助的。 - Garret Wilson
LayoutWrappingEncoder
中的getBytes()
使用)有点复杂,但并非神秘。这些链接可能有助于确定UTF-8来自何处? - vanOekelgetBytes()
的值,这意味着使用了Charset.defaultCharset
的值。而奇怪的是……在我的Windows系统上,这返回UTF-8!这很令人惊讶,因为我一直以为InputStreamReader
在Windows上默认不是UTF-8(例如Windows-1252
)……但是不,它也返回“UTF8”!也许我的Eclipse+Maven设置做了一些奇怪的事情,或者Java 8改变了默认设置。无论如何,vanOekel,你想提供一个答案来获得赏金吗? - Garret Wilson