Was sind die Unterschiede zwischen Linux- und Windows-TXT-Dateien (Unicode-Codierung)?

16

Ich verwende nur den im ursprünglichen ANSI-Standard definierten 128-Zeichensatz.

Aber wie werden die Dateien insgesamt anders implementiert?

Es geht mir nicht um die Anzeige, dh wenn eine Registerkarte mit 6 oder 8 Zeichen angezeigt wird, sondern um die eigentliche interne Darstellung im Speicher

Ein Unterschied, den ich gehört habe, ist die Verwendung von \ r \ n (Windows) vs. \ n für die Leitungsbeendigung (Linux).

Hennes
quelle
Ich denke, das Byte Order Mark tötet mein #! (Erste Zeile) in meinen PHP-Dateien, die ich von Windows auf Linux übertragen habe. Die ganze Datei funktioniert, aber der Interpreter kann nicht wie gewünscht gefunden werden. Wenn ich specefically sicherstellen, in ANSI zu kodieren, indem ich die Kodierungsmethode im Notizblock vorwähle, ist es zutreffendes ASCII oder tut Windows noch etwas
Überprüfen Sie, ob Ihr Gnu / Linux-Rechner Bomstrip enthält. Es ist Teil von Debian (und zumindest einigen anderen), muss aber möglicherweise installiert werden. Dies ist erforderlich, da Microsoft fälschlicherweise eine Stückliste zum Start von utf-8-Dateien hinzufügt.
Strg-Alt-Delor

Antworten:

17

"Unicode" unter Windows ist UTF-16LE, und jedes Zeichen besteht aus 2 oder 4 Bytes. Linux verwendet UTF-8 und jedes Zeichen besteht aus 1 bis 4 Byte.

"Das absolute Minimum, das jeder Softwareentwickler unbedingt und unbedingt über Unicode und Zeichensätze wissen muss (keine Ausreden!)"

Ignacio Vazquez-Abrams
quelle
Windows verschwendet ein Byte?
1
Wenn Sie nichts außerhalb von Latin-1 verwenden, ja.
Ignacio Vazquez-Abrams
Sie sind in dem Artikel, den ich verlinkt habe.
Ignacio Vazquez-Abrams
1
Es wurde nach UTF-16LE gesucht, aber im Artikel nicht gefunden.
1
Meistens. Sie müssen auch die Stückliste zählen, falls vorhanden.
Ignacio Vazquez-Abrams
11

Zeilenumbrüche

Windows verwendet CRLF ( \r\n, 0D 0A) -Zeilenenden, während Unix nur LF ( \n, 0A) verwendet.

Zeichenkodierung

Die meisten modernen (dh seit 2004 oder so) Unix-ähnlichen Systeme machen UTF-8 zur Standard-Zeichenkodierung.

Windows bietet jedoch keine native Unterstützung für UTF-8. Es funktioniert intern in UTF-16 und setzt voraus, dass sich char-basierte Zeichenfolgen in einer älteren Codepage befinden . Glücklicherweise kann Notepad UTF-8-Dateien lesen. Leider ist "ANSI" -Codierung immer noch die Standardeinstellung.

Problematische Sonderzeichen

U + 001A ERSATZ

Windows verwendet (selten) Ctrl+ Zals Dateiendezeichen. Wenn Sie beispielsweise typeeine Datei an der Eingabeaufforderung eingeben, wird diese beim ersten 1AByte abgeschnitten .

Unter Unix ist Ctrl+ Znichts Besonderes.

U + FEFF ZERO MIT NO-BREAK SPACE (Byte-Order Mark)

Unter Windows beginnen UTF-8-Dateien häufig mit einem "Byte Order Mark" EF BB BF, um sie von ANSI-Dateien zu unterscheiden.

Unter Linux wird von der Stückliste abgeraten, da sie in Shell-Skripten Dinge wie Zeilenumbrüche unterbricht. Außerdem wäre es sinnlos, eine UTF-8-Signatur zu haben, wenn UTF-8 ohnehin die Standardkodierung ist.

user46971
quelle
1
Strg-Z funktioniert unter Windows genauso wie Strg-D (oder ein anderes Zeichen, mit dem Sie an EOF gebunden sind stty) unter Linux: Der Konsolentreiber übersetzt es in das Dateiende. Das Literalzeichen wird nicht im Eingabestream angezeigt. es bewirkt nur, dass read () 0
zurückgibt
Ich denke, das Byte Order Mark tötet mein #! (Erste Zeile) in meinen PHP-Dateien, die ich von Windows auf Linux übertragen habe. Die ganze Datei funktioniert, aber der Interpreter kann nicht wie gewünscht gefunden werden. Wenn ich sicher gehe, dass ich in ANSI codiere, indem ich die Codierungsmethode im Editor auswähle, ist es echtes ASCII oder macht Windows etwas anderes?
1
Es ist erwähnenswert, dass der Pseudobegriff „ANSI-Codepage“, obwohl er in Programmen wie Notepad immer noch vorkommt, absolut falsch ist, und Microsoft hat dies vor langer Zeit zugegeben. Weitere Informationen finden Sie unter en.wikipedia.org/wiki/Windows_code_page .
Incnis Mrsi
utf-8 hat keine Stückliste, aber MS-Windows fügt eine ein. Machen Sie es nicht wahr utf-8. Eine der Regeln von utf-8 ist, dass jede Datei, die in ascii dargestellt werden könnte, in utf-8 Bit für Bit identisch ist. Sie können auch an jeder Stelle im Stream mit dem Lesen von utf-8 beginnen.
Strg-Alt-Delor
3

Ein Unterschied, den ich gehört habe, ist die Verwendung von \ r \ n (Windows) vs. \ n für Zeilenumbrüche (Linux).

Ja. Die meisten UNIX-Texteditoren erledigen dies automatisch, die Editoren von Windows-Programmierern erledigen dies möglicherweise, die allgemeinen Texteditoren (Basis-Editor) nicht.

Windows scheint in einigen Kontexten auch das EOF (Strg-Z) als END OF FILE zu benötigen , wohingegen Sie es unter UNIX wahrscheinlich nie sehen werden.

Denken Sie daran, dass MacOS X jetzt UNIX ist und daher UNIX-Zeilenenden verwendet. Obwohl es vor OS X (MacOS 9 und niedriger) eine eigene Endung hatte (\ r)

EDIT: in anderen Formaten CR und LF:

  • \ n ist ASCII 0x0A, Zeilenvorschub (LF)
  • \ r ist ASCII 0x0D, Wagenrücklauf (CR)
Reiche Homolka
quelle
Wo befinden sich \ r \ n und \ n im ASCII-Zeichensatz? en.wikipedia.org/wiki/File:ASCII_Code_Chart.svg
2
@Chris \ n ist ASCII 0x0A, Zeilenvorschub. \ r ist ASCII 0x0D, Wagenrücklauf
Rich Homolka
Was ist mit EOF? Ist das ein ANSI-Zeichen?
2
@barlop, das Terminal übersetzt den Tastenanschlag (normalerweise Strg-D auf Unix-Systemen) in EOF, es sei denn, diese Steuertaste wurde deaktiviert. Die Anwendung liest eine EOF und nicht die tatsächliche Taste, die Sie drücken. Dies bedeutet, dass read()anstelle eines bestimmten Zeichens null Bytes zurückgegeben werden.
Psusi
1
@barlop, das ist , was ich gesagt habe: Es ist nicht zurückgibt jeden Charakter. read () gibt die Anzahl der in Ihrem Puffer gespeicherten Bytes zurück. Auf EOF gibt es Ihnen einfach null Bytes. Dies ist das Signal, dass Sie das Ende der Datei erreicht haben und nichts mehr zu lesen ist.
Psusi
1

Die verwendete Unicode-Codierung basiert nicht auf dem Betriebssystem.

Sogar in Windows notepad.exe sind Optionen aufgeführt - (ich werde in Klammern setzen, was Notepad damit bedeutet) ANSI (nicht Unicode), Unicode (Notepad bedeutet Unicode LE), Unicode Big Endian (BE), UTF-8

ANSI ist kein Unicode, es enthält nur eine sehr begrenzte Anzahl von Zeichen.

Aber auch Notizblock kann LE, BE oder UTF-8

Abgesehen vom Notizblock kann UTF-8 mit oder ohne Stückliste sein.

Und ich verwende Windows mit Cygwin, obwohl Windows-Ports möglicherweise \ r \ n auch dann funktionieren, wenn Sie Folgendes angeben \ n Habe gesehen, dass sed dies tut.

Es gibt keine einzige Regel, welche Unicode-Codierung ein bestimmtes Betriebssystem verwendet. Es wäre kein sehr flexibles Betriebssystem, wenn es eines gäbe.

Um die Unterschiede wirklich erkennen zu können, muss die Software wissen, welche Codierung eine Software verwendet oder anbietet.

Holen Sie sich Cygwin und xxd und / oder einen Hex-Editor und schauen Sie sich an, was wirklich in der Datei enthalten ist. Verwenden Sie den Befehl 'file', um eine Datei zu identifizieren. Dann sehen Sie tatsächlich, was UTF 16bit LE ist. Was ist UTF 16bit BE? Was UTF-8 ist (und UTF-8 kann mit oder ohne Stückliste sein).

Manchmal kann man notepad anweisen, als Unicode zu speichern (wobei notepad 16-Bit-Little-Endian-Unicode bedeutet), was aber nicht der Fall ist. Wählen Sie jedoch eine Unicode-Schriftart wie arial Unicode und kopieren Sie einige Unicode-Zeichen aus charmap. Sie können auch anhand des Hexadezimalwerts einer Datei feststellen, was für ein Editor oder welche Software gerade ausgeführt wird

C:\asdf>notepad.exe a.a

C:\asdf>file a.a
a.a; Little-endian UTF-16 Unicode text, with no line terminators

C:\asdf>type a.a
aaa慡ൡ <-- though displayed aaa followed by some boxes in my cmd window
C:\asdf>

C:\asdf>xxd a.a
0000000: fffe 6100 6100 6100 6161 610d            ..a.a.a.aaa.

C:\asdf>

^^ The portion of the byte that stores the 61 is the lower value portion which with LE is stored first.

Der Befehl dd (ein * nix-Befehl, den ich in cygwin unter Windows ausführe) kann ihn umschalten

C:\asdf>xxd -p a.a
fffe6100610061006161610d

C:\asdf>file a.a
a.a; Little-endian UTF-16 Unicode text, with no line terminators

C:\asdf>dd if=a.a conv=swab of=a.a2
0+1 records in
0+1 records out
12 bytes (12 B) copied, 0 seconds, Infinity B/s

C:\asdf>type a.a2
a  a a aaa
C:\asdf>xxd -p a.a2
feff00610061006161610d61

C:\asdf>file a.a2
a.a2; Big-endian UTF-16 Unicode text, with no line terminators

C:\asdf>

Und Notizblock selbst kann als UTF-16 Big Endian oder UTF-16 Little Endian oder UTF-8 speichern

Bildbeschreibung hier eingeben

Wenn Sie eine technische Person oder nur ein Editor-Benutzer sind, sind Sie aufgrund Ihres Betriebssystems nicht an eine Codierung gebunden!

Ich nehme an, UTF-8 ist sinnvoller als UTF-16. UTF-16 würde 16 Bit auch für Zeichen verwenden, die nur 8 Bit benötigen sollten. Beachten Sie jedoch, dass charmap den UTF-16-Code anzeigt.

Sublime (Ein Windows-Texteditor) speichert Unicode standardmäßig als UTF-8.

Ich benutze Windows und manchmal Unicode, und ich verwende meistens UTF-8.

Und da Windows technisch so flexibel ist, ist Linux mindestens so technisch flexibel!

barlop
quelle
Haben Sie die Befehle fileund typein der Cygwin-Eingabeaufforderung geschrieben?
Vesnog
xxdund typeBefehle fehlen in der Cygwin-Standardinstallation, nehme ich an. Ansonsten möchte ich Ihre Ergebnisse reproduzieren.
Vesnog
1
@Vesnog typeist ein in cmd.exe xxdintegrierter Standardbefehl, der höchstwahrscheinlich nicht standardmäßig mit cygwin installiert wird. Wenn Sie jedoch cygwin installieren oder danach das Setup von cygwin starten, erhalten Sie eine lange Liste von Befehlen, die Sie zur Verwendung in cygwin installieren können. Geben Sie einfach xxd in das Suchfeld von cygwin setup ein und es wird angezeigt. xxd ist auch nach der Installation von vim7 verfügbar, sodass Sie es auch von dort beziehen können.
Barlop
1
@ Vesnog Sie können Cygwin-Befehle innerhalb von Cygwin oder außerhalb von Cygwin ausführen. Wenn Sie sie außerhalb von cygwin ausführen, fügen Sie c:\cygwin\bin(sofern sich dort das Unterverzeichnis bin von cygwin befindet) in Ihren Pfad ein. Auch jeder interne Befehl wie 'type' oder 'dir' oder jede externe Exe wie calc.exe (Windows-Rechner) kann in cygwin ausgeführt / gestartet werden. So ziemlich alles, was von cygwin ausgeführt werden kann, kann von cmd ausgeführt werden und umgekehrt. Wenn Sie bash verwenden möchten, verwenden Sie cygwin. Wenn Sie Probleme mit einfachen oder doppelten Anführungszeichen haben, führen Sie cygwin-Befehle in cygwin und cmd-Befehle in cmd aus.
Barlop
1
@Vesnog xxd kann auch eine Datei schreiben, z. B. echo 61|xxd -r -p>a.adann versuchen. type a.a Sie können also mit xxd -p einen Byte-Speicherauszug erstellen, die Bytes neu anordnen oder ändern und dann in xxd -r -p einfügen und eine neue andere Datei mit einer anderen Codierung oder erstellen unterschiedliche Daten basierend auf den alten Daten. Der Befehl "file" ermittelt die Codierung basierend auf den Bytes.
Barlop
-1

Linux verwendet UTF-8 und jedes Zeichen ist zwischen 1 und 6 Byte groß, nicht zwischen 1 und 4 Byte.

U00000000 - U0000007F: 0xxxxxxx
U00000080 - U000007FF: 110xxxxx 10xxxxxx
U00000800 - U0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U00010000 - U001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U00200000 - U03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U04000000 - U7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
it_is_a_literature
quelle
Dies wurde bereits in einer Antwort im Jahr 2011 angegeben.
Ramhound