Search code examples
javaeclipsemavenlogback

Logback diacritical letters and additional lines on Windows, Java, maven, eclipse


The program uses logger (logback) to write a text. The text contains diacritical letters. Output is correct when the program runs on Eclipse (console). The project and all configuration based on UTF-8.

After create jar file and running it on Windows console (cmd), output has additional letters and lines (when the line contains diacritical letters). Windows console configuration UTF-8 (chcp 65001) and font Lucida Console.

Why the additional lines appears?

/writeStdout/src/main/java/com/writeStdout/WriteStdout.java

package com.writeStdout;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class WriteStdout {

public static void main(String[] args) {
    Logger logger = LoggerFactory.getLogger(WriteStdout.class);

    logger.debug("This is a text without diacritical letters.");
    logger.debug("This is a text with diacritical letters żółć żółć.");
    logger.debug("This is a text without diacritical letters.");
    logger.debug(
            "This is a text with diacritical letters ślężańską źródłowość.");
    logger.debug("This is a text without diacritical letters.");
    }
}

Eclipse Console (proper output):

This is a text without diacritical letters.
This is a text with diacritical letters żółć żółć.
This is a text without diacritical letters.
This is a text with diacritical letters ślężańską źródłowość.
This is a text without diacritical letters.

Windows Console (additional lines and letters):

This is a text without diacritical letters.
This is a text with diacritical letters żółć żółć.
�łć.

This is a text without diacritical letters.
This is a text with diacritical letters ślężańską źródłowość.
owość.

This is a text without diacritical letters.

/writeStdout/src/main/resources/logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration> 
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <charset>UTF-8</charset>
            <pattern>%msg%n
            </pattern>
        </encoder>
    </appender>
    <root level="DEBUG">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

/writeStdout/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.writeStdout</groupId>
    <artifactId>writeStdout</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>writeStdout</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.source>1.8</maven.compiler.source>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.0.2</version>
                <configuration>
                    <archive>
                        <manifest>
                            <classpathPrefix>lib</classpathPrefix>
                            <addClasspath>true</addClasspath>
                            <mainClass>com.writeStdout.WriteStdout</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Now I have Java 1.8.0_144

java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)    

Writing output to file

java -jar target\writeStdout-0.0.1-SNAPSHOT.jar > c:\logs\d.log

generate correct file

5468 6973 2069 7320 6120 7465 7874 2077
6974 686f 7574 2064 6961 6372 6974 6963
616c 206c 6574 7465 7273 2e0d 0a54 6869
7320 6973 2061 2074 6578 7420 7769 7468
2064 6961 6372 6974 6963 616c 206c 6574
7465 7273 20c5 bcc3 b3c5 82c4 8720 c5bc
c3b3 c582 c487 2e0d 0a54 6869 7320 6973
2061 2074 6578 7420 7769 7468 6f75 7420
6469 6163 7269 7469 6361 6c20 6c65 7474
6572 732e 0d0a 5468 6973 2069 7320 6120
7465 7874 2077 6974 6820 6469 6163 7269
7469 6361 6c20 6c65 7474 6572 7320 c59b
6cc4 99c5 bc61 c584 736b c485 20c5 ba72
c3b3 64c5 826f 776f c59b c487 2e0d 0a54
6869 7320 6973 2061 2074 6578 7420 7769
7468 6f75 7420 6469 6163 7269 7469 6361
6c20 6c65 7474 6572 732e 0d0a 

This is a text without diacritical letters.
This is a text with diacritical letters żółć żółć.
This is a text without diacritical letters.
This is a text with diacritical letters ślężańską źródłowość.
This is a text without diacritical letters.

Command:

type c:\logs\d.log

shows correct content.

Writing text to file (logback level):

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="DEV_HOME" value="c:/logs" />
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <charset>UTF-8</charset>
            <pattern>%msg%n
            </pattern>
        </encoder>
    </appender>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${DEV_HOME}/debug.log</file>
        <append>true</append>
        <immediateFlush>true</immediateFlush>
        <encoder>
            <charset>UTF-8</charset>
            <pattern>%msg%n</pattern>
        </encoder>
    </appender>
    <root level="DEBUG">
        <appender-ref ref="FILE" />
    </root>
</configuration>

generate correct file.


Solution

  • I've created a github project for it:

    https://github.com/riskop/logback_diacritical.git

    It works for me as expected:

    C:\Users\riskop\Documents\test\logback_diacritical\target>ver
    Microsoft Windows [Version 10.0.14393]
    
    C:\Users\riskop\Documents\test\logback_diacritical\target>java -version
    openjdk version "1.8.0_40"
    OpenJDK Runtime Environment (build 1.8.0_40-b25)
    OpenJDK Client VM (build 25.40-b25, mixed mode)
    
    C:\Users\riskop\Documents\test\logback_diacritical\target>chcp
    Active code page: 65001
    
    C:\Users\riskop\Documents\test\logback_diacritical\target>java -jar 
    writeStdout-0.0.1-SNAPSHOT.jar
    This is a text without diacritical letters.
    This is a text with diacritical letters żółć żółć.
    This is a text without diacritical letters.
    This is a text with diacritical letters ślężańską źródłowość.
    This is a text without diacritical letters.
    

    What is your java / windows version?

    Ps.: If I direct the output to file, I get this:

    00000000 54 68 69 73  20 69 73 20  61 20 74 65  78 74 20 77 This is a text w...  
    00000010 69 74 68 6F  75 74 20 64  69 61 63 72  69 74 69 63 ithout diacritic...  
    00000020 61 6C 20 6C  65 74 74 65  72 73 2E 0D  0A 54 68 69 al letters...Thi...  
    00000030 73 20 69 73  20 61 20 74  65 78 74 20  77 69 74 68 s is a text with...  
    00000040 20 64 69 61  63 72 69 74  69 63 61 6C  20 6C 65 74  diacritical let...  
    00000050 74 65 72 73  20 C5 BC C3  B3 C5 82 C4  87 20 C5 BC ters ż ó ł ć  ż....  
    00000060 C3 B3 C5 82  C4 87 2E 0D  0A 54 68 69  73 20 69 73 ó ł ć ...This is...  
    00000070 20 61 20 74  65 78 74 20  77 69 74 68  6F 75 74 20  a text without....  
    00000080 64 69 61 63  72 69 74 69  63 61 6C 20  6C 65 74 74 diacritical lett...  
    00000090 65 72 73 2E  0D 0A 54 68  69 73 20 69  73 20 61 20 ers...This is a....  
    000000A0 74 65 78 74  20 77 69 74  68 20 64 69  61 63 72 69 text with diacri...  
    000000B0 74 69 63 61  6C 20 6C 65  74 74 65 72  73 20 C5 9B tical letters ś....  
    000000C0 6C C4 99 C5  BC 61 C5 84  73 6B C4 85  20 C5 BA 72 lę ż ań ską  ź r...  
    000000D0 C3 B3 64 C5  82 6F 77 6F  C5 9B C4 87  2E 0D 0A 54 ó dł owoś ć ...T...  
    000000E0 68 69 73 20  69 73 20 61  20 74 65 78  74 20 77 69 his is a text wi...  
    000000F0 74 68 6F 75  74 20 64 69  61 63 72 69  74 69 63 61 thout diacritica...  
    00000100 6C 20 6C 65  74 74 65 72  73 2E 0D 0A              l letters..........  
    

    What is your output in this form?