Ich schreibe ganzzahlige Werte in eine Datei aus Kotlin (Kotlin Int-Typ) und verwende dabei so etwas
var1BufferedWriter?.write(String.format("%d\n", intvar ) )
var2BufferedWriter?.write(String.format("%08x\n", intvar ) )
var1
oben wird in textfile.txt
und var2
in geschrieben textfile_hex.txt
. Beide werden im SD-Kartenspeicher des Android-Telefons gespeichert. Wenn ich sie auf einen Windows-PC kopiere und sie im Editor öffne, sieht textfile.txt so aus
während textfile_hex.txt folgendermaßen aussieht:
Wenn ich textfile.txt in einem Hex-Editor öffne, kann ich sehen, dass alle Daten in der Datei korrekt sind und meinen Erwartungen entsprechen. Notepad++ zeigt auch alles korrekt an. Das Seltsame ist, dass ich vor dem Wochenende dieselbe App verwendet habe, um viele andere Dateien ähnlich textfile.txt zu erstellen, und sie sahen in Windows alle normal aus. In den Android- oder Notepad-Einstellungen wurde nichts geändert.
Ist das normales Verhalten? Handelt es sich hier um eine Art Kodierungsproblem? Warum zeigt Notepad einige TXT-Dateien korrekt an und andere nicht?
Windows-Version:
Edition Windows 10 Pro
Version 22H2
OS Build 19045.4046
Erfahrung Windows Feature Experience Pack 1000.19053.1000.0
Antwort1
Die Datei löst einenFalsch-Positivin Notepads "Ist Unicode"-Erkennung. (Das Problem hat sogareine eigene Wikipedia-Seite.)
Wenn Ihre „intvar“ immer Null ist, besteht die Datei vollständig aus wiederholten
"0\n"
, die als Bytes{0x30, 0x0A}
in ASCII (und/oder in UTF-8) gespeichert sind."0" "\n" "0" "\n" "0" "\n" ... 30 0A 30 0A 30 0A ...
Sie sehen das Unicode-Zeichen
"ਰ"
aka"\u0A30"
akaU+0A30, welches istAuchals Bytes{0x30, 0x0A}
in UTF-16 LE gespeichert."ਰ" "ਰ" "ਰ" ... 30 0A 30 0A 30 0A ...
Eine leichte Änderung der Ausgabe – z. B. das Hinzufügen einer Art „offensichtlich ASCII“-Header oder Kommentar – würde das Problem umgehen.
Sie können dem Inhalt der Datei auch ein Präfix "\xEF\xBB\xBF"
(oder "\uFEFF"
, je nachdem, welche Schreibweise Java/Kotlin bevorzugt) voranstellen. Dies ist der Standardheader, um anzuzeigen, dass eine Datei UTF-8 ist und würde dazu führen, dass Notepad (und alle anderen Texteditoren) die automatische Erkennung überspringen.
Wenn Android es unterstützt, können Sie die Datei wie folgt schreiben lassen:tatsächlichUTF-16 (vorzugsweise mit eingeschlossenem BOM, damit dieser Teil der Formaterkennung umgangen wird).
(Bei Ihren anderen Dateien ist das Problem wahrscheinlich nicht aufgetreten, da sie mindestens einen Wert ≥10 aufweisen, der die Bytes „falsch ausrichtet“, sodass sie für den Erkennungscode eher wie ASCII und weniger wie UTF-16 aussehen.)