Jaki znak reprezentuje nowy wiersz w polu tekstowym

87

Tylko szybkie, ale chcę się upewnić, że łapię odmiany między platformami.

Lubię konwertować nowe wiersze wprowadzone do obszaru tekstowego na [przecinek], aby wynik mógł być przedstawiony w jednej linii, moje pytanie ...

Obecnie, wysyłając z Google Chrome, kiedy widzę wartość, stwierdzam, że używa ona \r\ndla nowych linii. Jeśli wymienię \r\n, wiem, że będzie działać dla Chrome w systemie Windows 7, ale co z innymi platformami, czy są różnice w tym, jakie inne przeglądarki wstawią jako nowy wiersz w obszarze tekstowym?

Ninjanoel
źródło
3
uprościć: czy wszystkie przeglądarki wysyłają „\ r \ n” tylko do reprezentowania nowej linii wprowadzonej do obszaru tekstowego (nie tworzę programowo wartości, jest ona tworzona tylko przez użytkownika w przeglądarce)
Ninjanoel

Odpowiedzi:

105

Zgodnie ze specyfikacjami HTML, przeglądarki są zobowiązane do kanonizacji podziałów wierszy w danych wejściowych użytkownika do CR LF ( \r\n) i nie sądzę, by jakakolwiek przeglądarka pomyliła się. Odniesienie: klauzula 17.13.4 Typy treści formularza w specyfikacji HTML 4.01.

W wersjach roboczych HTML5 sytuacja jest bardziej skomplikowana, ponieważ zajmują się one również procesami wewnątrz przeglądarki, a nie tylko danymi, które są wysyłane do programu obsługi formularzy po stronie serwera, gdy formularz jest wysyłany. Według nich (i praktyki przeglądarek) textareawartość elementu występuje w trzech wariantach:

  1. surowa wartość wprowadzona przez użytkownika, nieznormalizowana; może zawierać parę CR, LF lub CR LF;
  2. wartość wewnętrzna, zwana „wartością API”, gdzie podziały linii są znormalizowane do LF (tylko);
  3. wartość przesyłania, gdzie podziały wierszy są znormalizowane do par CR LF, zgodnie z konwencjami internetowymi.
Jukka K. Korpela
źródło
4
HTML 5 Spec: w3.org/html/wg/drafts/html/CR/forms.html#the-textarea-element : the user agent should allow the user to edit, insert, and remove text, and to insert and remove line breaks in the form of "LF" (U+000A) characters.
ComFreek
Dzięki, poprawiłeś mi humor! Właśnie mylić bo kiedy wysyłanie zawartości od textarea na OSX / chrom, przeglądarka wysyła go z CR LF ..
starikovs
3
Kolejne pytanie brzmi: dlaczego kiedy dostaniesz ".length" obszaru tekstowego, liczy on CR LF jako tylko jeden znak, ale kiedy sprawdzasz po stronie serwera (na przykład z PHP strlen) będą to dwa znaki ...
starikovs
2
Powyższy link @ ComFreek jest dziś uszkodzony, użyj: w3.org/TR/html5/forms.html#the-textarea-element
Glen Mazza,
@starikovs, przypuszczam, że odpowiedziano na to wewnętrzną wartością, zwaną „wartością API”, gdzie podziały wierszy są znormalizowane do LF (tylko); część. To, co widzisz jako jeden znak (mianowicie \n), jest prawdopodobnie tym, co zapewnia „wewnętrzny interfejs API”. Bez odniesienia, to tylko moje przypuszczenie oparte na zdrowym rozsądku.
user907860
12

Mówienie konkretnie o obszarach tekstowych w formularzach internetowych, dla wszystkich obszarów tekstowych, na wszystkich platformach, \r\nbędzie działać.

Jeśli użyjesz czegokolwiek innego, spowodujesz problemy z wycinaniem i wklejaniem na platformach Windows.

Podziały wierszy będą kanonizowane przez przeglądarki Windows po przesłaniu formularza, ale jeśli wyślesz formularz do przeglądarki z \npodziałem wierszy, zauważysz, że tekst nie zostanie poprawnie skopiowany i wklejony między na przykład notatnikiem a obszarem tekstu.

Co ciekawe, pomimo uniksowej konwencji końca linii \n, standard w większości tekstowych protokołów sieciowych, w tym HTTP, SMTP, POP3, IMAP i tak dalej, jest nadal \r\n. Tak, może to nie mieć większego sensu, ale to dla Ciebie historia i ewoluujące standardy!

Ben
źródło
6

Wygląda na to, że zgodnie ze specyfikacją HTML5 właściwość value elementu textarea powinna zwracać '\ r \ n' dla nowej linii:

Tego elementu wartość określa się jako wartość podstawowa elementu z zastosowano następującą Transformacja

Zastąp każde wystąpienie znaku „CR” (U + 000D), po którym nie następuje znak „LF” (U + 000A), oraz każde wystąpienie znaku „LF” (U + 000A) nie poprzedzonego znakiem „CR” ( U + 000D) za pomocą dwuznakowego ciągu składającego się z pary znaków U + 000D CARRIAGE RETURN „CRLF” (U + 000A).

Podążanie za linkiem do „value” wyjaśnia, że ​​odnosi się on do właściwości value, do której można uzyskać dostęp w javascript:

Kontrolki formularza mają wartość i sprawdzalność. (Ta ostatnia jest używana tylko przez elementy wejściowe). Są one używane do opisania interakcji użytkownika z kontrolką.

Jednak we wszystkich pięciu głównych przeglądarkach (w systemie Windows, 27.11.2015), jeśli „\ r \ n” jest wpisane w obszarze tekstowym, znak „\ r” jest usuwany. (Aby przetestować: var e = document.createElement ('textarea'); e.value = '\ r \ n'; alert (e.value == '\ n');) Dotyczy to IE od wersji 9. Wcześniej IE zwracał „\ r \ n” i konwertował zarówno „\ r”, jak i „\ n” na „\ r \ n” (co jest specyfikacją HTML5). Więc ... Jestem zdezorientowany.

Aby być bezpiecznym, zwykle wystarczy użyć „\ r? \ N” w wyrażeniach regularnych zamiast po prostu „\ n”, ale jeśli sekwencja nowej linii musi być znana, w aplikacji można przeprowadzić test podobny do powyższego.

barncat
źródło
Czy z tej samej strony wartość uzyskana przez JS nie jest nazywana wartością API?
Anshul
@Anshul - rozumiem, co masz na myśli. Pierwotne pytanie brzmiało: „Obecnie wysyłam z Google Chrome, kiedy widzę wartość, stwierdzam, że używa \ r \ n dla nowych wierszy ...” Tak więc, ponieważ jest wysyłany, myślę, że wartość jest odczytywana serwer. Zakładałem, że to z JS. W każdym razie, mam nadzieję, że opublikowane przeze mnie fakty okażą się przydatne. Dzięki za komentarz.
barncat
@brancat, myślę, że język serwera nie powinien mieć tutaj znaczenia. Specyfikacja HTML5 jest bardzo jasna w dwóch kwestiach dotyczących pliku textarea. 1. Treść żądania będzie miała tylko \ r \ n 2. Wartość JS będzie miała tylko \ n, niezależnie od tego, czy użyjesz \ r, \ r \ n, czy \ n podczas pisania. Pasuje również do wyników uzyskanych w IE9 +.
Anshul
5

- Line Feed and 
 Carriage Return

Te encje HTML wstawią nowy wiersz lub powrót karetki do obszaru tekstowego.

Damodar Das
źródło
11
tak naprawdę nie odpowiada na pytanie
cherouvim
2
@cherouvim, nie mogę zrozumieć, dlaczego głosowałeś na tę odpowiedź? Czy przeczytałeś powyższe pytanie? Nie udzielaj błędnych odpowiedzi w komentarzach bez zrozumienia niczego!
Mahbub
3
@Mahbub: Ta odpowiedź ma obecnie 3 głosy przeciw, ponieważ nie odpowiada na pytanie.
cherouvim
Nie odpowiada na pytanie.
Mike Devenney
1
Cóż, szukałem tego, co & # 13; Oznaczało to odpowiedź i pomógł mi, więc nie czuję się źle, wszystkie informacje są dobre informacje i pomaga ludziom z losowo razy :)
jackrabbithanna