Als ich ein Java-Programm auf dem CentOS Docker-Container ausführte, trat ein mysteriöses verstümmeltes Zeichen auf, als ich eine Liste von Dateien mit japanischen Dateinamen erhielt.
Sample.java
import java.io.*;
public class Sample {
public static void main(String[] args) {
//Dateiname ist japanische Datei "/sample/AIUEO.Platziere "csv"
new File("/sample").listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
System.out.println(name); // =>Der japanische Dateiname wird beim Abrufen der Dateiliste verstümmelt
return false;
}
});
}
}
Übrigens wurde bestätigt, dass verstümmelte Zeichen nicht auftreten, wenn die Umgebungsvariable LANG auf "en_US.UTF-8" gesetzt ist, und verstümmelte Zeichen auftreten, wenn sie auf "ja_JP.UTF-8" gesetzt ist.
Dieser Artikel beschreibt die Ursachen von verstümmelten Zeichen in japanischen Dateinamen und wie man damit umgeht.
Erstens führt das Setzen von "ja_JP.UTF-8" in der Umgebungsvariablen LANG zu verstümmelten Zeichen, da das japanische Gebietsschema nicht im ** CentOS-Image von Docker ** registriert ist.
Sie können die Gebietsschemas, die in der Umgebungsvariablen LANG angegeben werden können, mit dem Befehl locale -a
überprüfen.
Führen Sie den Befehl im Container des CentOS-Images aus, um dies zu überprüfen.
# locale -a
C
POSIX
en_US.utf8
Wie oben erwähnt, ist das japanische Gebietsschema nicht im Docker CentOS-Bildcontainer enthalten. Wenn Sie versuchen, die Dateiliste von einem Java-Programm abzurufen, indem Sie die Umgebungsvariable LANG angeben, wie unten in diesem Container gezeigt, wird der japanische Dateiname verstümmelt.
LANG=ja_JP.UTF-8
export LANG
java Sample
=>Verstümmelter japanischer Dateiname.csv
Um dieses Problem zu umgehen, verwenden Sie den Befehl localedef
, um ** ein japanisches Gebietsschema hinzuzufügen **, um die verstümmelten Zeichen zu entfernen.
Fügen Sie den folgenden Befehl als RUN-Befehl in die Docker-Datei ein oder führen Sie ihn im Container aus.
# localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
Überprüfen Sie die Gebietsschemas, die mit dem Befehl locale -a
erneut angegeben werden können.
# locale -a
C
POSIX
en_US.utf8
ja_JP.utf8
Der Befehl localedef
fügte ja_JP.utf8
hinzu.
Selbst wenn Sie die Umgebungsvariable LANG festlegen, können Sie jetzt japanische Dateinamen ohne verstümmelte Zeichen verarbeiten.