Jaka jest różnica między \n
(nowa linia) a \r
(powrót karetki)?
W szczególności, czy istnieją jakieś praktyczne różnice między \n
i \r
? Czy są miejsca, w których należy użyć jednego zamiast drugiego?
Jaka jest różnica między \n
(nowa linia) a \r
(powrót karetki)?
W szczególności, czy istnieją jakieś praktyczne różnice między \n
i \r
? Czy są miejsca, w których należy użyć jednego zamiast drugiego?
Odpowiedzi:
Pod względem kodu ascii jest to 3 - ponieważ mają odpowiednio 10 i 13 ;-).
Ale poważnie, istnieje wiele:
\n
jest kodem końca linii, \r
co nie znaczy nic specjalnego\n
jest standardową sekwencją ucieczki dla końca linii (w razie potrzeby przetłumaczoną na sekwencje specyficzne dla systemu operacyjnego)\r
zamiast tego znajdował się kod końca linii\r\n
, w tej kolejności\r\n
to standardowe zakończenie linii dla formatów tekstowych w Internecie\r
nakazuje karetce cofanie się w lewo, aż dojdzie do lewego skrajnego zatrzymania (wolna operacja), \n
rolce zwinięcie jednej linii (znacznie szybsza operacja) - to jest powód, dla którego zawsze masz \r
wcześniej \n
, aby rolka mogła się poruszać, gdy karetka wciąż jedzie w lewo! -) Wikipedia ma bardziej szczegółowe wyjaśnienie .\r
a \n
działają podobnie (z wyjątkiem zarówno pod względem kursora, jak tam jest nie przewóz lub wałek ;-)W praktyce, w nowoczesnym kontekście pisania do pliku tekstowego, zawsze powinieneś używać \n
(bazowe środowisko wykonawcze tłumaczy to, jeśli masz dziwny system operacyjny, np. Windows ;-). Jedynym powodem \r
jest to, że piszesz na terminalu znaków (lub bardziej prawdopodobne, że emuluje go „okno konsoli”) i chcesz, aby następny wiersz, który piszesz, zastąpił ostatnio napisany (czasem używany do głupiej animacji ascii) „efekty np. pasków postępu) - staje się to jednak dość przestarzałe w świecie GUI ;-).
\0
dodano dodatkowe nieszkodliwe znaki (zazwyczaj tj. NUL ), \n
aby umożliwić dodatkowe czas. Zostało to obsługiwane w sposób transparentny przez system operacyjny, więc nie znajdziesz żadnych śladów w starszym kodzie.
\r
(używam Linuksa). Gdy zacząłem analizować plik, który wydawał się być poprawnym plikiem, mój parser zawiódł, ponieważ plik, który analizowałem, został utworzony w systemie Windows. : D Głównym problemem w tym wszystkim, jest to, że ani \n
czy \r
są widoczne w tym sensie, że na przykład a
, .
, (
itp znaki są.
Historycznie \n
używano a do przesuwania karetki w dół, podczas gdy \r
używano do przesuwania karetki z powrotem na lewą stronę strony.
printf("abcdefghijlm\rNOP\n");
skompilowany z gcc-8 na OpenSuSe i uruchom na terminalu wyniki w tym wyniku NOPdefghijlm
. \ R (powrót karetki) w ciągu powoduje, że kursor przesuwa się na początek linii (karetki), a znaki następujące po \ r (tj. „NOP”) zastępują to, co wcześniej tam było (tj. „Abc”)! Możesz osiągnąć podobny „ruch karetki” za pomocą backspace (\ b), co w printf("abcdefghijlm\b\bNOP\n");
którym produkujeabcdefghijNOP
Dwie różne postacie.
\n
jest używany jako terminator końca linii w plikach tekstowych systemu Unix
\r
jest używany jako terminator końca linii w plikach tekstowych Mac
\r\n
(tj. oba) są używane do zakończenia linii w plikach tekstowych Windows i DOS.
\r
od dawna nie było końca linii na komputerze Mac. Wraz z wydaniem Mac OS X w 2001 roku (który jest oparty na Uniksie), \n
jest teraz używany.
\r
- np. MS Office 2011 Excel: Zapisanie pliku CSV (ze wszystkimi ustawieniami domyślnymi) - spowoduje zapisanie pliku zakodowanego w standardzie ISO-8859-1 z \r
zakończeniami -line.
Ponieważ nikt inny nie wspomniał o tym konkretnie (czy są zbyt młodzi, by wiedzieć / pamiętać?) - podejrzewam, że jest to użycie \r\n
w maszynach do pisania i podobnych urządzeniach.
Gdy chciałeś nowego wiersza, korzystając z maszyny do pisania obsługującej wiele wierszy, trzeba było wykonać dwie czynności fizyczne: przesunąć karetkę z powrotem na początek strony (po lewej, w USA) i podać papier o jeden stopień .
Na przykład w czasach drukarek liniowych jedynym sposobem na pogrubienie tekstu było na przykład powrót karetki BEZ nowej linii i wydrukowanie tych samych znaków na starych, dodając w ten sposób więcej atramentu, przez co wydaje się ciemniejszy (pogrubiony) . Gdy mechaniczna funkcja „nowego wiersza” nie powiodła się w maszynie do pisania, był to irytujący wynik: możesz pisać powyżej poprzedniego wiersza tekstu, jeśli nie zwracasz uwagi.
Dwa różne znaki dla różnych systemów operacyjnych. Odgrywa to również rolę w przesyłanych danych, TCP/IP
które wymagają użycia\r\n
.
\n
Unix
\r
Prochowiec
\r\n
Windows i DOS.
Ukończyć,
W skrypcie powłoki (bash) możesz użyć \r
do wysłania kursora, z przodu on-line i oczywiście\n
aby umieścić kursor w nowej linii.
Na przykład spróbuj:
echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
AA--AA
AA--AABB
BB--AABB
Ale nie zapomnij użyć -en
jako parametrów.
W Windows \ n przechodzi na początek następnego wiersza. \ R przesuwa się na początek bieżącej linii, bez przechodzenia do następnej linii. Użyłem \ r we własnych aplikacjach konsolowych, w których testuję trochę kodu i nie chcę, aby tekst przewijał się po ekranie, więc zamiast używać \ n po wydrukowaniu tekstu, powiedzmy, liczby klatek na sekundę ( FPS), wydrukujęf („% - 10d \ r”, fps); Spowoduje to powrót kursora na początek linii bez przechodzenia do następnej linii i pozwoli mi wyświetlać na ekranie inne informacje, które nie zostaną przewinięte, gdy liczba klatek na sekundę będzie stale aktualizowana w tym samym wierszu (% -10 powoduje pewne wyjście ma co najmniej 10 znaków, wyrównane do lewej, więc kończy się spacjami, nadpisując wszelkie stare wartości dla tego wiersza). Jest to całkiem przydatne do takich rzeczy,
Trochę historii
/ R oznacza „return” lub „return return”, który zawdzięcza swoją historię maszynie do pisania. Zwrot karetki przesunął karetkę do końca w prawo, więc pisałeś na początku wiersza.
Symbol „n” oznacza „nową linię”, ponownie od dni, w których maszyna do pisania przeszła na nową linię. Jednak nie od samego początku, dlatego niektóre systemy operacyjne przyjęły potrzebę zarówno powrotu a / r, a następnie nowej linii / n, ponieważ taka była kolejność, w jakiej zrobiła to maszyna do pisania. Wyjaśnia także stare 8-bitowe komputery, które używały mieć „Return” zamiast „Enter” z „return return”, co było znane.
Żeby dodać zamieszanie, pracowałem nad prostym edytorem tekstu wykorzystującym element TextArea na stronie HTML w przeglądarce. W oczekiwaniu na problemy z kompatybilnością w odniesieniu do CR / LF napisałem kod, aby sprawdzić platformę i użyć dowolnej konwencji nowej linii, która miała zastosowanie do platformy.
Jednak odkryłem coś ciekawego podczas sprawdzania rzeczywisty znaki zawarte w TextArea, za pomocą małej funkcji JavaScript, która generuje dane szesnastkowe odpowiadające tym znakom.
Do testu wpisałem następujący tekst:
Witaj świecie [wejdź]
Do widzenia, okrutny świecie [wejdź]
Gdy sprawdziłem dane tekstowe, otrzymałem następującą sekwencję bajtów:
48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 0a 47 6f 6f 64 62 79 65 2c 20 43 72 75 65 6c 20 57 6f 72 6c 64 0a
Teraz większość ludzi, patrząc na to i widząc 0a, ale bez bajtów 0d, pomyślałoby, że ten wynik uzyskano na platformie Unix / Linux. Ale oto rub: tę sekwencję uzyskałem w Google Chrome na Windows 7 64-bit.
Tak więc, jeśli używasz elementu TextArea i badasz tekst, SPRAWDŹ wynik, tak jak to zrobiłem powyżej, aby upewnić się, jakie rzeczywiste bajty znaków są zwracane z Twojego TextArea. Nie wiem, czy różni się to na innych platformach lub w innych przeglądarkach, ale warto o tym pamiętać, jeśli wykonujesz przetwarzanie tekstu za pomocą JavaScript i musisz uniezależnić tę platformę przetwarzania tekstu.
Konwencje opisane w powyższych postach dotyczą danych wyjściowych konsoli , ale elementy HTML, jak się wydaje, są zgodne z konwencją UNIX / Linux. Chyba że ktoś odkryje inaczej na innej platformie / przeglądarce.
#include <stdio.h>
void main()
{
int countch=0;
int countwd=1;
printf("Enter your sentence in lowercase: ");
char ch='a';
while(ch!='\r')
{
ch=getche();
if(ch==' ')
countwd++;
else
countch++;
}
printf("\n Words = ",countwd);
printf("Characters = ",countch-1);
getch();
}
weźmy ten przykład spróbuj umieścić \ n zamiast \ r to nie zadziała i spróbuj zgadnąć dlaczego?
Return
i drugie Enter
. Nawet moja nowoczesna klawiatura bezprzewodowa nadal pokazuje strzałkę w dół i do tyłu na starym Return
klawiszu (który jest teraz zatytułowany „Enter”, aby zachować spójność z klawiszem klawiatury numerycznej Enter
, który nie pokazuje strzałki)
Jaka jest różnica między \ n (nowa linia) i \ r (powrót karetki)?
W szczególności, czy istnieją jakieś praktyczne różnice między
\n
i\r
? Czy są miejsca, w których należy użyć jednego zamiast drugiego?
Chciałbym zrobić krótki eksperyment z odpowiednimi sekwencjami ucieczki \n
dla nowej linii i\r
dla znaku powrotu karetki, aby zilustrować, gdzie jest wyraźna różnica między nimi.
Wiem, że to pytanie zostało zadane jako niezależne od języka. Niemniej jednak potrzebujemy języka przynajmniej w celu przeprowadzenia eksperymentu. W moim przypadku wybrałem C ++, ale eksperyment powinien zasadniczo mieć zastosowanie w dowolnym języku programowania.
Program po prostu wykonuje iterację, aby wydrukować zdanie w konsoli, wykonując iterację dla pętli for.
Program Newline:
#include <iostream>
int main(void)
{
for(int i = 0; i < 7; i++)
{
std::cout << i + 1 <<".Walkthrough of the for-loop \n"; // Notice `\n` at the end.
}
return 0;
}
Wynik:
1.Walkthrough of the for-loop
2.Walkthrough of the for-loop
3.Walkthrough of the for-loop
4.Walkthrough of the for-loop
5.Walkthrough of the for-loop
6.Walkthrough of the for-loop
7.Walkthrough of the for-loop
Zauważ, że ten wynik nie zostanie podany w żadnym systemie, wykonujesz ten kod C ++. Ale to powinno działać w przypadku najnowocześniejszych systemów. Przeczytaj poniżej, aby uzyskać więcej informacji.
Teraz ten sam program, ale z tą różnicą, że \n
jest zastępowany \r
na końcu sekwencji drukowania.
Program zwrotu karetki:
#include <iostream>
int main(void)
{
for(int i = 0; i < 7; i++)
{
std::cout << i + 1 <<".Walkthrough of the for-loop \r"; // Notice `\r` at the end.
}
return 0;
}
Wynik:
7.Walkthrough of the for-loop
Zauważyłeś, gdzie jest różnica? Różnica jest taka, że w przypadku korzystania z sekwencji ucieczki powozu\r
na końcu każdej sekwencji drukowania, następna iteracja tej sekwencji nie przechodzi do następującego wiersza tekstowego - Na końcu każdej sekwencji drukowania kursor nie przeskoczył na początek * następnej linii.
Zamiast tego kursor przeskoczył z powrotem na początek linii, na której był na końcu, przed użyciem \r
znaku. - W rezultacie każda kolejna iteracja sekwencji drukowania zastępuje poprzednią.
* Uwaga: A \n
niekoniecznie przeskakuj na początek następnej linii tekstu. W niektórych, ogólnie starszych, systemach operacyjnych wynikiem \n
znaku nowej linii może być to, że przeskakuje on w dowolne miejsce w następnej linii, a nie tylko na początek. Dlatego wymagają użycia, \r \n
aby dostać się na początek następnego wiersza tekstu.
Ten eksperyment pokazał nam różnicę między znakiem nowej linii i znakiem powrotu karetki w kontekście wyniku iteracji sekwencji drukowania.
Dyskutując o danych wejściowych w programie niektóre terminale / konsole mogą pośrednio konwertować znak powrotu karetki na nowy wiersz w celu lepszej przenośności, kompatybilności i integralności.
Ale jeśli masz wybór, aby wybrać jeden dla drugiego lub chcesz lub musisz wyraźnie użyć tylko określonego, zawsze powinieneś działać z tym, który pasuje do jego celu i ściśle rozróżnia.