当前位置: 首页 > 知识库问答 >
问题:

LayoutWrappingCoder的LogBack默认字符集?

阎单鹗
2023-03-14

Logback 1.1.3LayoutWrappingEncoder留档没有指出如果用户不设置默认字符集,它将是什么,但源代码说:

默认情况下,此属性的值为null,对应于系统的默认字符集。

然而,我使用的是PatternLayoutCoder(带有滚动文件附加器),它似乎是以UTF-8格式输出文件(我的Windows 7 Professional系统的默认字符集可能不是UTF-8)。

UTF-8输出实际上是我想要的,但我想确保我不是偶然得到它的,因为文档似乎表明了其他一些东西。那么,当我没有明确指定字符集时,为什么Logback会给我UTF-8输出呢?

共有2个答案

华睿识
2023-03-14
匿名用户

系统的默认字符集由Java确定,并在系统属性文件中设置。编码,但也可以在JVM启动时指定此属性(此答案中有更多内容)。Eclipse、Netbeans、Maven等可以使用此系统属性将默认字符集设置为UTF-8,这可能就是为什么输出为UTF-8,即使您没有指定它。

要删除chance元素,请指定要记录的字符集,如此答案所示。Logback的源代码显示了如何使用字符集将字符串转换为字节,以便在convertToBytes方法中写入文件(有关字符串到字节的更多信息,请参阅本答案)。

在Unix上,文件的值。编码是使用环境变量确定的(例如,如这里所述,通过LANG=en\u US.UTF-8,但也可能涉及其他环境变量)
在Windows上,默认代码页显示为命令chcp。代码页码与此列表中显示的字符集相对应。例如,代码页65001对应UTF-8。默认语言环境是通过命令systeminfo | findstr locale显示的。

简而言之:一旦您的软件离开您的开发环境,您就不能假设任何特定的默认字符集。因此,始终指定一个字符集。

荀辰钊
2023-03-14

回退字符编码

您可以使用

因此,如果通过代码进行配置,则可以使用UTF-8调用setCharset方法。或者,如果您是通过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,或者从文件中提取UTF-8。编码是由您自行设置的,无法保证将来会发生这种情况。

顺便提一下,Sun之前曾提到过该文件。编码,如果您在Oracle VM上设置此选项:

J2SE平台规范不需要“file.encoding”属性;这是Sun实现的内部细节,不应该由用户代码检查或修改。它也是只读的;从技术上讲,不可能在命令行或程序执行期间的任何其他时间支持将此属性设置为任意值。

Eclipse和Maven

如果您正在从eclipse运行maven,并且您已经在环境/项目或运行配置中将环境设置为UTF-8(对于我,在公共选项卡中),那么eclipse将通过设置文件来安排新JVM使用UTF-8编码。编码。请参阅:Eclipse的编码文档

 类似资料:
  • 问题内容: 是否可以通过SQL语句确保列的默认值为空字符串而不是? 问题答案: 是-使用DEFAULT约束:

  • 请查找我的应用程序登录FileAppender配置。 我没有为警报文件追加器配置任何rollingpolicy,但仍在进行滚动。我需要一个单一的文件,我的所有错误通过一天,一年等,请帮助。 谢谢Satyajit

  • 问题内容: 很抱歉,这个愚蠢的问题已被搜索,但不确定是否找到了正确的答案,因此默认分隔符仅是awk的空间? 问题答案: 这是适用于 所有主要Awk实现* 的 实用摘要 : * GNU awk中() -默认在 一些 Linux发行版 Mawk () -默认在 一些 Linux发行版(例如,早期版本的Ubuntu的crysman报道称,版本19.04现在带有 GNU awk中-见下面他的评论) BSD

  • 问题内容: 是否可以通过SQL语句确保列的默认值为空字符串而不是? 问题答案: 是-使用DEFAULT约束:

  • 问题内容: 如何通过编程正确设置JVM(1.5.x)使用​​的默认字符编码? 我读过,这-曾经是使用旧JVM的方法。由于没有理由,我没有那么奢侈。 我试过了: 并且该属性被设置,但似乎不会导致下面的最终调用使用UTF8: 问题答案: 不幸的是,必须在JVM启动时指定该属性。通过输入你的主要方法时,编码中使用的字符由和默认的构造函数,并已被永久缓存。 正如指出的那样,在这种特殊情况下, 可以使用环境

  • 问题内容: 我正在用Java编程 我的代码为: 在api中指定,如果不指定字符编码,它将采用默认的平台字符编码。 “默认平台字符编码”是什么意思? 它是Java编码还是OS编码? 如果这意味着操作系统编码,如何检查Windows和Linux的默认字符编码?无论如何,我们可以使用命令行获取默认的字符编码吗? 问题答案: 这表示您正在运行的JVM的默认字符编码, 要检查默认编码,您可以执行以下操作: