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).
Antworten:
"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!)"
quelle
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
type
eine Datei an der Eingabeaufforderung eingeben, wird diese beim ersten1A
Byte 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.
quelle
stty
) unter Linux: Der Konsolentreiber übersetzt es in das Dateiende. Das Literalzeichen wird nicht im Eingabestream angezeigt. es bewirkt nur, dass read () 0Ja. 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:
quelle
read()
anstelle eines bestimmten Zeichens null Bytes zurückgegeben werden.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
Der Befehl dd (ein * nix-Befehl, den ich in cygwin unter Windows ausführe) kann ihn umschalten
Und Notizblock selbst kann als UTF-16 Big Endian oder UTF-16 Little Endian oder UTF-8 speichern
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!
quelle
file
undtype
in der Cygwin-Eingabeaufforderung geschrieben?xxd
undtype
Befehle fehlen in der Cygwin-Standardinstallation, nehme ich an. Ansonsten möchte ich Ihre Ergebnisse reproduzieren.type
ist ein in cmd.exexxd
integrierter 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.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.echo 61|xxd -r -p>a.a
dann 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.Linux verwendet UTF-8 und jedes Zeichen ist zwischen 1 und 6 Byte groß, nicht zwischen 1 und 4 Byte.
quelle