webentwicklung-frage-antwort-db.com.de

Abhängig von der Standardkodierung, was soll ich verwenden und warum?

FindBugs meldet einen Fehler: 

Vertrauen Sie auf die Standardkodierung Es wurde ein Aufruf an eine Methode gefunden, die eine Konvertierung von Byte in String (oder String in Byte) durchführt und davon ausgeht, dass die standardmäßige Plattformkodierung geeignet ist. Dadurch ändert sich das Anwendungsverhalten von Plattform zu Plattform. Verwenden Sie eine alternative API, und geben Sie explizit einen Zeichensatznamen oder ein Zeichensatzobjekt an.

Ich habe FileReader so benutzt (nur ein Stück Code):

public ArrayList<String> getValuesFromFile(File file){
    String line;
    StringTokenizer token;
    ArrayList<String> list = null;
    BufferedReader br = null;
    try {
        br = new BufferedReader(new FileReader(file));
        list = new ArrayList<String>();
        while ((line = br.readLine())!=null){
            token = new StringTokenizer(line);
            token.nextToken();
            list.add(token.nextToken());
    ...

Um den Fehler zu korrigieren, muss ich mich ändern 

br = new BufferedReader(new FileReader(file));

zu 

br = new BufferedReader(new InputStreamReader(new FileInputStream(file), Charset.defaultCharset()));

Und wenn ich PrintWriter verwende, ist der gleiche Fehler aufgetreten. So, jetzt habe ich eine Frage. Wenn ich FileReader und PrintWriter verwenden kann (soll), sollten Sie sich auf die Standardcodierung verlassen? Und die zweite Frage ist, Charset.defaultCharset () ordnungsgemäß zu verwenden. Ich entschied mich für diese Methode zur automatischen Definition des Zeichensatzes des Betriebssystems des Benutzers. 

19
Nikolas

Wenn die Datei von Ihrer Anwendung gesteuert wird und Sie möchten, dass die Datei in der Standardcodierung der Plattform codiert wird, können Sie die Standardcodierung der Plattform verwenden. Durch die explizite Angabe wird klarer, für Sie und zukünftige Betreuer, dass dies Ihre Absicht ist. Dies wäre zum Beispiel ein vernünftiger Standard für einen Texteditor, der dann Dateien schreibt, die jeder andere Editor auf dieser Plattform dann lesen kann.

Wenn Sie andererseits sicherstellen möchten, dass alle möglichen Zeichen in Ihre Datei geschrieben werden können, sollten Sie eine universelle Kodierung wie UTF8 verwenden.

Wenn die Datei von einer externen Anwendung stammt oder mit einer externen Anwendung kompatibel sein soll, sollten Sie die Kodierung verwenden, die diese externe Anwendung erwartet.

Sie müssen wissen, dass Sie, wenn Sie eine Datei wie auf einem Computer schreiben und auf einem anderen Computer lesen, der nicht die gleiche Standardcodierung hat, dies nicht unbedingt tun können Lesen Sie, was Sie geschrieben haben. Durch die Verwendung einer bestimmten Kodierung (UTF8) zum Schreiben und Lesen wird sichergestellt, dass die Datei immer gleich ist, unabhängig von der Plattform, auf der die Datei geschrieben wird.

21
JB Nizet

Im Idealfall sollte es sein:

try (InputStream in = new FileInputStream(file);
     Reader reader = new InputStreamReader(in, StandardCharsets.UTF_8);
     BufferedReader br = new BufferedReader(reader)) {

...oder:

try (BufferedReader br = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {

... vorausgesetzt, die Datei ist als UTF-8 codiert.

So ziemlich jede Kodierung, die kein Unicode-Transformationsformat ist, ist für Daten in natürlicher Sprache veraltet. Es gibt Sprachen, die Sie ohne Unicode nicht unterstützen können.

20
McDowell

Sie sollten die Standardkodierung verwenden, wenn Sie eine Datei lesen, die sich außerhalb Ihrer Anwendung befindet und von der lokalen Kodierung des Benutzers ausgegangen werden kann, beispielsweise von Benutzern geschriebene Textdateien. Möglicherweise möchten Sie beim Schreiben solcher Dateien die Standardkodierung verwenden, je nachdem, was der Benutzer später mit dieser Datei tun soll.

Sie sollten nicht die Standardcodierung für andere Dateien verwenden, insbesondere für anwendungsrelevante Dateien.

Wenn Ihre Anwendung beispielsweise Konfigurationsdateien im Textformat schreibt, sollten Sie immer die Kodierung angeben. Im Allgemeinen ist UTF-8 immer eine gute Wahl, da es mit fast allem kompatibel ist. Andernfalls kann es zu Überraschungen der Benutzer in anderen Ländern kommen.

Dies ist nicht nur auf die Zeichenkodierung beschränkt, sondern auch auf Datum/Uhrzeit, numerische oder andere sprachspezifische Formate. Wenn Sie beispielsweise die Standardcodierung und die Standard-Datums-/Uhrzeit-Zeichenfolgen auf einem US-Computer verwenden und versuchen, diese Datei auf einem deutschen Server zu lesen, werden Sie vielleicht überrascht sein, warum die eine Hälfte Kauderwelsch hat und die andere Hälfte verwirrt ist um eine Stunde wegen der Sommerzeit.

3
TwoThe

Wenn Sie einen PrintWriter verwenden,

File file = new File(file_path);
Writer w = new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_16.name());
PrintWriter pw = new PrintWriter(w);
pw.println(content_to_write);
pw.close();
0
prime