[LINUX] Der japanische Dateiname wird beim Festlegen der LANG-Umgebungsvariablen beim Ausführen des Java-Programms auf dem Docker-Container verstümmelt

Überblick

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.

Ursache und Abhilfe

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.

Fazit

Recommended Posts

Der japanische Dateiname wird beim Festlegen der LANG-Umgebungsvariablen beim Ausführen des Java-Programms auf dem Docker-Container verstümmelt
Starten Sie den Docker-Container, wenn Sie Pytest ausführen