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

后勤系统。err输出使用错误的编码

乌璞瑜
2023-03-14

我在Windows 10上使用Logback 1.2.11和Java17。我正在使用以下logback.xml

<configuration>
  <property scope="context" name="COLORIZER_COLORS" value="boldred@,boldyellow@,boldcyan@,@,@" />
  <conversionRule conversionWord="colorize" converterClass="org.tuxdude.logback.extensions.LogColorizer" />
  <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
  <appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender">
    <target>System.err</target>
    <withJansi>true</withJansi>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
      <pattern>[%colorize(%level)] %msg%n</pattern>
    </encoder>
  </appender>
  <root level="INFO">
    <appender-ref ref="STDERR" />
  </root>
</configuration>

如果在我的代码中我使用了System.out.printlncode>或System.err.println ("é"),我会在控制台上看到一个é(U 00E9,带有尖锐口音的小字母e)。但是,如果我通过Logback(通过SLF4J)登录,它会在屏幕上显示一个Θ字符(U 0398,希腊大写字母θ)。无论我使用

默认情况下,ConsoleAppenderPatternLoutEncoder应使用系统默认编码。(有关详细讨论,请参阅LayoutWrappingEncoder的LogBack默认字符集?)我的语言环境中的Windows 10控制台编码应该是Windows-1252(或Powershell、ISO-8859-1)。θ字符甚至不会出现在这些字符集中。

当Logback应该打印字符时,为什么要将字符打印到标准输出?更一般地说,为什么在打印到系统时不使用默认编码。输出系统。错误


共有1个答案

龙弘盛
2023-03-14
匿名用户

看起来Logback使用了错误的“默认字符集”。系统的API Javadocs。out表示其默认字符集(也适用于System.err):

“标准”输出流。此流已经打开并准备接受输出数据。通常此流对应于显示输出或主机环境或用户指定的其他输出目标。从字符到字节转换中使用的编码等效于Console.charset()如果Console存在,Charset.defaultCharset()否则。

在我的Windows 10命令提示符下,Charset。defaultCharset()返回windows-1252,而系统返回。控制台()。charset()返回IBM437。如果创建一个新的OutputStreamWriter(System.out,System.console())。charset())并写入字符串,它会按预期生成字符串。但如果我使用新的OutputStreamWriter(System.out,Charset.defaultCharset())并写入“é”,它会生成!这就是Θ的来源,它是IBM437字符集的一部分!

这里我不会问为什么我的Windows 10命令提示符默认为IBM437作为其默认字符集;在这个问题的背景下,这与问题无关。

根本问题似乎是Logback错误地检索了默认字符集。(说来话长,但基本上Logback依赖于默认的字符集String.getBytes())最终,LayoutWrappingCoder中的Lobback依赖于字符集的值。defaultCharset(),与控制台的不匹配;相反,它应该默认为系统。控制台()。charset()如果要匹配控制台的默认字符集。

显然,LayoutWrappingCoder不知道它是否正在写入控制台或其他实际上使用字符集的输出流。defaultCharset()。也许需要某种方法来实现ch.qos。返回日志。果心OutputStreamAppender可以将其字符集公开给LayoutWrappingCoder和ch.qos。返回日志。果心ConsoleAppender可以基于系统覆盖默认设置。控制台()。charset()而不是charset。defaultCharset()。

在任何情况下,罪魁祸首似乎是使用错误的默认字符集为系统的控制台进行回登录。输出和系统。错误。(任何人都知道我如何告诉Logback使用System.console()。charset()而不是charset。defaultCharset()?我当然无法提前知道默认控制台字符集,所以我无法将其硬编码到logback中。xml

我已经提交了Logback错误LOGBACK-1642。

 类似资料:
  • 我试图在Amazon EMR集群上运行一个自定义JAR,使用自定义JAR的输入和输出参数作为S3 bucket(

  • 问题内容: 为什么我从以下代码中获得“ AAAAAAAAA”而不是“ 1A234A567”: 任何想法? 问题答案: 函数以正则表达式为参数。和正则表达式“。” 表示“任何字符”。您必须对其进行转义以指定它是您想要的字符:

  • 具体参见:com.gitee.easyopen.message.Errors.java 注:0~100为系统占用的code码 -9=系统错误 1=调用不存在的服务请求 2=服务请求参数非法 3=服务请求缺少应用键参数 4=服务请求的应用键参数无效 5=服务请求需要签名,缺少签名参数 6=服务请求的签名无效 7=服务请求超时 8=服务请求业务逻辑出错 9=服务不可用 10=服务请求时间格式有误 11

  • 我的一个模块项目中有一个考勤系统,使用PHP和MySQL,MySQL表如下所示: 现在,时间表被用来存储一天中某一段的类时间表,以及分配给哪位老师。student_info表包含有关学生及其所属部分的一般信息。attendancetable用于记录缺勤人员,使用时间和学生id作为主键。 我可以得到一个学期有多少类被录取的统计如下: 然后计算一个学生参加的次数,也计算出勤率。 现在,我还想显示一种考

  • 我的任务是创建一个名为MyRectangle的类来表示矩形。 所需的数据字段是宽度、高度和颜色。宽度和高度使用双数据类型,颜色使用字符串。然后编写一个程序来测试MyRectangle类。在客户端程序中,创建两个MyRectangle对象。为两个对象中的每一个指定宽度和高度。将第一个对象指定为红色,将第二个对象指定为黄色。显示两个对象的所有属性,包括其面积。 我已经写了所有的东西,没有错误,但是无论