Używam tylko zestawu znaków 128 zdefiniowanego w oryginalnym standardzie ANSI.
Ale jako całość pliki są różnie wszczepiane.
Nie interesuje mnie wyświetlanie, tzn. Czy karta jest wyświetlana z 6 lub 8 znakami, ale z faktyczną wewnętrzną reprezentacją w pamięci
Jedną z różnic, jakie słyszałem, jest użycie \ r \ n (Windows) vs. \ n do zakończenia linii (Linux).
Odpowiedzi:
„Unicode” w systemie Windows to UTF-16LE, a każdy znak ma 2 lub 4 bajty. Linux używa UTF-8, a każdy znak ma od 1 do 4 bajtów.
„Absolutne minimum Każdy twórca oprogramowania absolutnie, pozytywnie musi wiedzieć o Unicode i zestawach znaków (bez wymówek!)”
źródło
Podziały wierszy
Windows używa zakończeń linii CRLF (
\r\n
,0D 0A
), podczas gdy Unix używa tylko LF (\n
,0A
).Kodowanie znaków
Większość współczesnych (tj. Od 2004 roku) systemów uniksowych sprawia, że UTF-8 jest domyślnym kodowaniem znaków.
Windows jednak nie ma natywnego wsparcia dla UTF-8. Działa wewnętrznie w UTF-16 i zakłada, że
char
łańcuchy oparte na starszej stronie kodowej . Na szczęście Notatnik może odczytywać pliki UTF-8; niestety kodowanie „ANSI” jest nadal domyślne.Problematyczne znaki specjalne
U + 001A SUBSTYTUT
Windows (rzadko) używa Ctrl+ Zjako znaku końca pliku. Na przykład, jeśli
type
plik znajduje się w wierszu polecenia, zostanie obcięty w pierwszym1A
bajcie.W Uniksie Ctrl+ Znie jest niczym specjalnym.
U + FEFF ZERO Z PRZESTRZEŃ BEZ PRZERWY (znak kolejności bajtów)
W systemie Windows pliki UTF-8 często zaczynają się od „znaku kolejności bajtów”,
EF BB BF
aby odróżnić je od plików ANSI.W Linuksie BOM jest odradzany, ponieważ przerywa takie rzeczy, jak linie shebang w skryptach powłoki. Ponadto nie ma sensu mieć podpisu UTF-8, gdy UTF-8 jest i tak domyślnym kodowaniem.
źródło
stty
systemie Windows, podobnie jak Ctrl-D (lub jakikolwiek znak, który przypisałeś do EOF ) w systemie Linux: sterownik konsoli tłumaczy go na koniec pliku. Dosłowny znak nie pojawia się w strumieniu wejściowym; po prostu powoduje, że read () zwraca 0.Tak. Większość edytorów tekstowych UNIX będzie to obsługiwać automatycznie, edytory dla programistów Windows mogą to obsłużyć, ogólne edytory tekstu (podstawowy Notatnik) nie.
Windows wydaje się także potrzebować EOF (Ctrl-Z) jako KONIEC PLIKU w niektórych kontekstach, podczas gdy prawdopodobnie nigdy go nie zobaczysz w systemie UNIX.
Pamiętaj, że MacOS X jest teraz pod UNIXem, więc używa zakończeń linii UNIX. Chociaż przed OS X (MacOS 9 i starsze) miał własne zakończenie (\ r)
EDYCJA: w innym formacie CR i LF:
źródło
read()
zwraca zero bajtów zamiast dowolnego określonego znaku.Zastosowane kodowanie Unicode nie jest oparte na systemie operacyjnym.
Nawet Windows notepad.exe ma wymienione opcje - (wstawię w nawiasach, co oznacza przez to notatnik) ANSI (nie Unicode), Unicode (notatnik oznacza Unicode LE), Unicode Big Endian (BE), UTF-8
ANSI nie jest Unicode, zawiera bardzo ograniczoną liczbę znaków, więc odłóżmy to na bok.
Ale patrz nawet notatnik może zrobić LE, BE lub UTF-8
Poza notatnikiem, UTF-8 może być z BOM lub bez niego.
I używam Windows z Cygwin, chociaż porty Windows mogą równie dobrze zrobić \ r \ n, nawet jeśli określisz \ n Widziałem, jak robi to sed.
Nie ma jednej reguły dotyczącej tego, jakiego kodowania Unicode używa dany system operacyjny. Gdyby tak było, nie byłby to bardzo elastyczny system operacyjny.
Aby naprawdę zobaczyć różnice, poznaj Oprogramowanie, czego używa lub oferuje Kodowanie oprogramowania.
Pobierz Cygwin i xxd i / lub edytor szesnastkowy i sprawdź, co naprawdę znajduje się w pliku. Użyj polecenia „plik”, aby pomóc zidentyfikować plik. Wtedy faktycznie widzisz, czym jest UTF 16bit LE. Co to jest UTF 16bit BE. Co to jest UTF-8 (a UTF-8 może być z BOM lub bez).
Czasami możesz powiedzieć Notatnikowi, aby zapisał jako Unicode (przez co Notatnik oznacza 16-bitowy mały endian) i tak się nie stanie. Ale wybierz czcionkę Unicode, taką jak Arial Unicode, i skopiuj niektóre znaki Unicode z Charmap, a to zrobi .. I dobrym sposobem, aby zobaczyć, co robi Notatnik lub cokolwiek innego oprogramowania, jest spojrzenie na hex pliku
Polecenie dd (polecenie * nix uruchamiane z cygwina w systemie Windows) może je przełączyć
A sam notatnik może zapisać jako UTF-16 Big Endian lub UTF-16 Little Endian lub UTF-8
Jeśli jesteś osobą techniczną, a nawet zwykłym użytkownikiem notatnika, nie jesteś związany żadnym kodowaniem z powodu swojego systemu operacyjnego!
Przypuszczam, że UTF-8 ma większy sens niż UTF-16, UTF-16 użyłby 16 bitów nawet dla znaków, które powinny potrzebować tylko 8 bitów. Pamiętaj jednak, że charmap pokazuje kod UTF-16.
Sublime (edytor tekstu systemu Windows) domyślnie zapisuje Unicode jako UTF-8.
Używam Windowsa, a czasem Unicode, i używam głównie UTF-8.
A ponieważ Windows jest technicznie elastyczny, Linux jest przynajmniej tak samo elastyczny technicznie!
źródło
file
itype
wewnątrz wiersza polecenia Cygwin?xxd
itype
przypuszczam, że brakuje poleceń w standardowej instalacji Cygwin. Poza tym chcę odtworzyć twoje wyniki.type
to standardowe polecenie wbudowane w cmd.exe,xxd
najprawdopodobniej domyślnie nie jest instalowane w programie cygwin, ale po zainstalowaniu programu cygwin lub po nim, jeśli uruchomisz instalację programu cygwin, otrzymasz długą listę poleceń, które możesz zainstalować w celu użycia w programie cygwin, i po prostu wpisz xxd w polu wyszukiwania instalatora cygwin i pojawi się. xxd jest również dostępny po instalacji vim7, więc możesz go również pobrać z tego miejsca.c:\cygwin\bin
(jeśli tam jest podkatalog bin cygwina) na swojej ścieżce. Również dowolne wewnętrzne polecenie cmd, takie jak „type” lub „dir”, lub dowolny zewnętrzny plik exe, taki jak calc.exe (kalkulator systemu Windows), można uruchomić / uruchomić z poziomu programu cygwin. Prawie wszystko, co można uruchomić z cygwina, można uruchomić z cmd i odwrotnie. Jeśli chcesz użyć bash, użyj cygwin, a jeśli napotkasz problemy z pojedynczymi lub podwójnymi cudzysłowami, uruchom polecenia cygwin w ramach cygwin i cmd w cmd.echo 61|xxd -r -p>a.a
Następnie spróbujtype a.a
Więc możesz faktycznie zrobić zrzut bajtów za pomocą xxd -p, zmienić kolejność lub zmodyfikować bajty, a następnie podać go do xxd -r -p i uzyskać nowy inny plik z innym kodowaniem lub różne dane na podstawie starych danych. Polecenie „file” określa kodowanie na podstawie bajtów.Linux używa UTF-8, a każdy znak ma od 1 do 6 bajtów, a nie od 1 do 4 bajtów.
źródło