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'
}
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();
}
}
Code: Select all
org.gradle.jvmargs=-Dfile.encoding=utf-8
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()'.
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
Проверка работоспособности И Ш
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]
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();
}
}
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
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();
}
}
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()'.
Code: Select all
Проверка работоспособности � Ш
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:
Проверка работоспособности �? Ш
Code: Select all
String testLine = new String("Проверка работоспособности И Ш".getBytes(StandardCharsets.UTF_8), "cp866");
Output:
?�?�???????�???? ?�???????�???�?????�?????????�?�?? ?� ?�
Code: Select all
String testLine = new String("Проверка работоспособности И Ш".getBytes(StandardCharsets.UTF_8), "utf-8");
Output:
�������� ����������������� � �
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();
}
}
Code: Select all
> Task :D.main()
UTF-8
�������� ����������������� � �
Code: Select all
Проверка работоспособности И Ш
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.
Mobile version