IntelliJ IDEA-Codierungsprobleme im Gradle-ProjektJava

Java-Forum
Anonymous
 IntelliJ IDEA-Codierungsprobleme im Gradle-Projekt

Post by Anonymous »

Normalerweise stelle ich hier keine Fragen, aber die Probleme, denen ich gegenüberstehe, sind so unheimlich, dass ich sie nicht mehr alleine bewältigen kann, ich bin erschöpft. Wie auch immer, ich werde alles beschreiben, was ich gefunden habe, und ich habe viele interessante Dinge gefunden, von denen ich glauben möchte, dass sie jemandem helfen, der mir hilft.

Softwareversionen:
- Betriebssystem: Windows 10 Pro Version: 1909 Build: 18363.720
- IntelliJ IDEA: 2019.2.4 Ultimate
- Gradle-Wrapper-Version: 5.2.1-all
- JDK: 8

Problem liegt in Codierungen, insbesondere in Konsolenausgabe im Gradle-Projekt.

Hier ist meine build.gradle-Datei:

Code: Select all

plugins {
id 'java'
id 'idea'
id 'application'
}

group 'com.diceeee.mentoring'
version 'release'

sourceCompatibility = 1.8
application.mainClassName('D')
compileJava.options.encoding = 'utf-8'

tasks.withType(JavaCompile) {
options.encoding = 'utf-8'
}

repositories {
mavenCentral()
jcenter()
}

dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
}
Meine Quellen sind in UTF-8-Kodierung mit CRLF, daher habe ich in build.gradle festgelegt, dass Quellen mit UTF-8-Kodierung anstelle meiner Systemstandard-Windows-1251-Kodierung kompiliert werden sollen.

Hier ist D.java:

Code: Select all

import java.io.FileWriter;
import java.io.IOException;

public class D {
public static void main(String[] args) throws IOException {
System.out.println(System.getProperty("file.encoding"));

String testLine = "Проверка работоспособности И Ш";
System.out.println(testLine);

FileWriter writer = new FileWriter("D:\\test.txt");
writer.write(testLine);
writer.close();
}
}
Außerdem habe ich gradle.properties mit einer Zeile:

Code: Select all

org.gradle.jvmargs=-Dfile.encoding=utf-8
Ich habe überprüft, ob es funktioniert, und habe mich davon überzeugt, dass die Codierung des Encoders in System.out tatsächlich auf utf-8 geändert wurde.

Wenn ich mein Gradle-Projekt ausführe, erhalte ich Folgendes:

Code: Select all

21:04:53: Executing task 'D.main()'...

> Task :compileJava UP-TO-DATE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE

> Task :D.main()
UTF-8
�������� ����������������� � �

Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/5.2.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 0s
2 actionable tasks: 1 executed, 1 up-to-date
21:04:54: Task execution finished 'D.main()'.
Es kommen weitere Informationen.
1) Es ist kein Zufall, dass ich die Ausgabe in der Datei im Code belassen habe. Wenn wir versuchen, in der Datei nachzusehen, können wir Folgendes sehen:

Code: Select all

Проверка работоспособности И Ш
Ich bin mir nicht sicher, ob es richtig ist, aber ich bin zu dem Schluss gekommen, dass das Problem irgendwo in der Konsole liegt, denn wenn es ein Problem mit der Standardkodierung gäbe, hätte der Dateischreiber die falsche Kodierung für die Datei verwendet und die Ausgaben wären gleich. Aber das passiert nicht.

2) Ich habe Interna der Klassen PrintStream, OutputStreamWriter und StreamEncoder debuggt. StreamEncoder verwendet tatsächlich den UTF-8-Zeichensatz und kodiert außerdem UTF-8-Text in die richtige Bytefolge:
String testLine = "Проверка работоспособности И Ш";
Jeder kyrillische Buchstabe ist 2 Bytes, Leerzeichen sind 1 Byte, wenn wir alle Buchstaben zählen, erhalten wir 57.

Schauen Sie sich jetzt hier an:
Encoder-Debugging-Bildschirm mit resultierenden Bytes

Wie wir sehen können, erhalten wir also diese ersten 57 Bytes (die anderen stammen von anderen Eingaben, die Puffernutzung ist begrenzt):

Code: Select all

[-48, -97, -47, -128, -48, -66, -48, -78, -48, -75, -47, -128, -48, -70, -48, -80, 32, -47, -128, -48, -80, -48, -79, -48, -66, -47, -126, -48, -66, -47, -127, -48, -65, -48, -66, -47, -127, -48, -66, -48, -79, -48, -67, -48, -66, -47, -127, -47, -126, -48, -72, 32, -48, -104, 32, -48, -88, 91]
Es sieht richtig aus, kyrillische Buchstaben sind codiert wie [-48, -97], [-47, -128] und andere Gruppen von 2 Bytes, sieht also gut aus, Leerzeichen werden ebenfalls berücksichtigt. Der Encoder leistet also gute Arbeit, er funktioniert, aber was passiert dann?
Ich weiß nicht. Ernsthaft. Aber es gibt noch mehr Infos. Wenn es Ihnen nicht umwerfend erschien, habe ich etwas anderes für Sie vorbereitet.

Ich habe ein sauberes Java-Projekt ohne Gradle/Maven usw. erstellt, nur mein eigenes JDK und nichts weiter.
Das Programm ist das gleiche:

Code: Select all

package com.company;

import java.io.FileWriter;
import java.io.IOException;

public class Main {

public static void main(String[] args) throws IOException {
System.out.println(System.getProperty("file.encoding"));

String testLine = "Проверка работоспособности И Ш";
System.out.println(testLine);

FileWriter writer = new FileWriter("D:\\test.txt");
writer.write(testLine);
writer.close();
}
}
Ich führe es aus und was bekomme ich?

Code: Select all

"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.2.4\lib\idea_rt.jar=58901:C:\Program Files\JetBrains\IntelliJ IDEA 2019.2.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;C:\Users\\IdeaProjects\test\out\production\test" com.company.Main
UTF-8
Проверка работоспособности И Ш

Process finished with exit code 0
Und danach bin ich einfach gestorben. Wtf passiert??? Zurück zum Gradle-Projekt für einen Moment. Ich habe eine kleine Änderung vorgenommen:

Code: Select all

import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class D {
public static void main(String[] args) throws IOException {
System.out.println(System.getProperty("file.encoding"));

String testLine = new String("Проверка работоспособности И Ш".getBytes(StandardCharsets.UTF_8), "windows-1251");
System.out.println(testLine);

FileWriter writer = new FileWriter("D:\\test.txt");
writer.write(testLine);
writer.close();
}
}
Und die Ausgabe lautet jetzt:

Code: Select all

21:43:06: Executing task 'D.main()'...

> Task :compileJava
> Task :processResources NO-SOURCE
> Task :classes

> Task :D.main()
UTF-8
Проверка работоспособности �? Ш

Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/5.2.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 0s
2 actionable tasks: 2 executed
21:43:06: Task execution finished 'D.main()'.
In der Datei:

Code: Select all

Проверка работоспособности � Ш
Außerdem war diese Ausgabe in der Konsole das erste, was mich dazu brachte, herauszufinden, was falsch läuft. Ich habe gerade programmiert und festgestellt, dass mit dem kyrillischen „И“ wirklich etwas nicht stimmt. Ich habe versucht, es zu lösen, und immer und immer wieder ... und jetzt bin ich hier, weil ich in der Sackgasse bin, ich habe alles versucht, was ich in ähnlichen Fragen und Themen zu Codierungsproblemen gefunden habe, ich habe einige Artikel über die Standardcodierung in Java gelesen, dass Windows cp866-Codierung in der Konsole verwendet, Windows-1251-Codierung als Standard, dass wir die Codierung explizit mit -Dfile.encoding=UTF-8 bestimmen müssen, nichts hilft, ich weiß nicht einmal, wonach ich suchen soll, um eine zu finden Problem. Ich dachte, Gradle würde die Eigenschaft nicht erkennen und der Zeichensatz sei immer noch Windows-1251, aber das Debuggen zeigte, dass ich falsch lag.

Nun, hier ist eine vollständige Liste der Dinge, die ich versucht habe, ein Problem zu lösen:
1) Setzen Sie -Dfile.encoding=UTF-8 in idea.exe.vmoptions und idea64.exe.vmoptions mit Neustart. Hat nicht geholfen.
2) Stellen Sie UTF-8 in IntelliJ IDEA ein -> Einstellungen -> Editor -> Dateikodierungen überall. Hat nicht geholfen.
3) Stellen Sie die Gradle-Compiler-Kodierung auf utf-8 ein. Hat nicht geholfen.
4) Stellen Sie die Gradle-JVM-Option org.gradle.jvmargs=-Dfile.encoding=utf-8 ein. Hat nicht geholfen.
5) Überprüft, ob Windows standardmäßig Russisch für Programme hat, die Unicode nicht für die Unterstützung von Kyrillisch unterstützen. Hat nicht geholfen.

Ich bin mir nicht sicher, was das Problem mit Gradle ist, denn ein sauberes Projekt ohne Gradle funktioniert großartig, die Konsolenausgabe ist in Ordnung. Aber bei Gradle sind kyrillische Symbole falsch. Außerdem habe ich versucht, die Ausgabe an die Konsole irgendwie mit getBytes(charset) und der neuen Methode/Konstruktor String(byte[], charset) zu korrigieren. Ich habe diese Varianten ausprobiert:

Code: Select all

String testLine = new String("Проверка работоспособности И Ш".getBytes(StandardCharsets.UTF_8), "windows-1251");

Output:
Проверка работоспособности �? Ш
Funktioniert nicht.

Code: Select all

String testLine = new String("Проверка работоспособности И Ш".getBytes(StandardCharsets.UTF_8), "cp866");

Output:
?�?�???????�???? ?�???????�???�?????�?????????�?�?? ?� ?�
Funktioniert nicht.

Code: Select all

String testLine = new String("Проверка работоспособности И Ш".getBytes(StandardCharsets.UTF_8), "utf-8");

Output:
�������� ����������������� � �
Ergebnis, das wir ohne Konvertierungen erhalten.

Außerdem habe ich noch etwas ausprobiert, nämlich den System.out-Wrapper, um eine andere Konsolenkodierung festzulegen.

Code: Select all

public class D {
public static void main(String[] args) throws IOException {
System.out.println(System.getProperty("file.encoding"));

System.setOut(new PrintStream(System.out, true, "utf-8"));
String testLine = "Проверка работоспособности И Ш";
System.out.println(testLine);

FileWriter writer = new FileWriter("D:\\test.txt");
writer.write(testLine);
writer.close();
}
}
Und wir haben immer noch nichts in der Ausgabe, es hat sich nicht einmal geändert:

Code: Select all

> Task :D.main()
UTF-8
�������� ����������������� � �
Nun, nach all diesen Informationen denke ich, dass etwas mit der Konsole selbst wirklich nicht gut ist, denn selbst die letzte Ausführung des obigen Codes hat diese Ausgabe in der Datei:

Code: Select all

Проверка работоспособности И Ш
Es ist in UTF-8-Kodierung, es ist die korrekte Ausgabe. Aber System.out.println gibt etwas Irrationales in der Konsole aus, selbst wenn Encoder gut funktioniert. Ich weiß nicht, was zum Teufel los ist (tut mir leid wegen Dirty Talk). Wenn das Problem wirklich in Gradle liegt, wie kann man es überprüfen? Oder wie lässt man Gradle eine andere Kodierung für die Konsolenausgabe verwenden? Oder ist es vielleicht immer noch etwas mit IntelliJ IDEA, auch wenn die Ausgabe in einem Projekt ohne Gradle korrekt ist?

Ich fühle mich wie ein Detektiv, aber ich bin ins Stocken geraten und in diesem Fall steckengeblieben. Ich bin dankbar, wenn mir jemand hilft.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post