Tarayıcılar "\ r \ n" veya "\ n" mi gönderiyor yoksa tarayıcıya mı bağlı?


102

Bu soru beni bir milyon yıldır rahatsız ediyor ... Çok satırlı (bir kullanıcının profili için "Biyo" gibi) metin alanına sahip bir web sitesi oluşturduğumda her zaman şu paranoyak kodu yazıyorum:

// C# code sample...
bio = bio.Replace("\r\n", "\n").Replace("\r", "\n");
bio = Regex.Replace(@"\n{2,}", "\n\n");

Öyleyse, tarayıcılar <textarea name="Bio"></textarea>birden çok satırı varsa ne için gönderir ?


Vay canına, bunun hiç dikkat çekmeyecek garip bir soru olduğunu düşündüm ... ama 1 saat içinde 16 oy, çılgınlık.
Timothy Khouri

Düşündüğümde bununla ilgili bir problemle hiç karşılaşmadım. Birisi bir satırsonu girerse, satırsonu olarak gösterilir, tüm işletim sistemlerinde, MySQL istemcilerinde, tarayıcılarda, vb. Görünüşe göre bu, çoğu yazılımın konuya biraz tutarlı bir şekilde yaklaştığı anlamına gelir. Tabii onunla önemli bir şey yapacaksam, her zaman normalleşirim.
Halil Özgür

"\ R \ n" ye güvenip ardından kullanıcının Biyografisinin "HTML formatlı" bir versiyonunu oluştursam ve hiçbir zaman "\ r \ n" ile karşılaşmadığım için, sorun ortaya çıkar. bir <p>etiket.
Timothy Khouri

Yanıtlar:


50

HTTP ve MIME gözlük o başlık satırları \ r \ n ile sona ermelidir belirtmek, ancak bir textarea içeriği ile ne yapılacağı konusunda (bazı onlar açık olup olmadığını o belli değil iddia ediyorum) net değildir. (Örneğin, sorunla ilgili bir HTML çalışma grubundan gelen bu ileti dizisine bakın .)

İleti başlıklarıyla ilgili HTTP / 1.1 özelliklerinden bir alıntı:

Mesaj başlığı alanları için satır sonlandırıcı, CRLF dizisidir. Ancak, bu tür başlıkları ayrıştırırken uygulamaların tek bir LF'yi satır sonlandırıcı olarak tanımasını ve baştaki CR'yi yok saymasını öneririz.

Bunun genel olarak iyi bir strateji olduğunu düşünüyorum: ürettikleriniz konusunda katı olun, ancak kabul ettiğiniz şey konusunda liberal olun. Her tür hat sonlandırıcı alacağınızı varsaymalısınız. (CRLF ve LF'ye ek olarak, Mac OS-9'un tek başına CR kullandığını ve çevrede bunlardan birkaçı olduğunu unutmayın. Unicode standardı (bölüm 5.8), satır sonlandırıcılar olarak tanınması gereken çok çeşitli karakter dizilerini belirtir; burada bunların bir listesi var .)


6
Teknik özelliklerin bir metin alanının ne ürettiğini belirttiğine inanmıyorum.
Mark Thomas

2
@Will: Orijinal soruyu tekrar okuyun. Özellikle tarayıcıların a içeriğini nasıl kodladığını sorar textarea(bu, spesifikasyonun veya en azından Ted'in alıntılanan bölümünün kısıtlamadığı bir şeydir).
John Bartholomew

2
@Mark - haklısın. Çeşitli forumlarda bu sorunla ilgili sonsuz tartışmalar var. ( Bir HTML çalışma grubundan 1995 tarihli bu konuya bakın .
Ted Hopp

2
Bu cevabın düzenlenmesi gerekiyor. HTTP spesifikasyonuna atıfta bulunmaya başlar, ancak bu metin alanlarıyla ilgili değildir.
DuckMaestro

2
Yaptım, ancak cevap hala HTTP'ye atıfta bulunmakla başlıyor, ki bu hiç bahsedilirse vurgulanması gereken yanlış özelliktir. Dahil ettiğiniz alıntı özellikle "ileti başlığı alanlarını" adresler, ancak ' textarealer ileti başlığı alanları olarak gönderilmez. textareafarklı olan mesaj gövdesine kodlanır.
DuckMaestro

30

<textarea></textarea>Birden çok satırı varsa tarayıcılar ne için gönderir ?

Tüm modern tarayıcılar CRLF ( \r\n) gönderir . Bununla birlikte, bu tatmin edici bir şekilde standartlaştırılmış bir şey değildir, bu nedenle tüm çok satırlı giriş metninin satırsonlarını normalleştirmenin kesinlikle faydalı olduğunu düşünürdüm.

Değer doğrudan bir formdan gönderilmek yerine JavaScript aracılığıyla okunduğunda, tarayıcı davranışı farklılık gösterir. IE ve Opera CRLF'ler ile dizeleri döndürür; Firefox ve WebKit, LF döndürür. Dolayısıyla, JavaScript / XMLHttpRequest yardımı ile gönderilen herhangi bir form büyük olasılıkla her iki biçimde de gelir.


JavaScript, platformlar arasında herhangi bir tarayıcıda tutarlı bir şekilde davranıyor mu? (Örneğin, Firefox Windows, Mac ve mobil platformlarda LF ile dizeler döndürüyor mu?)
Ted Hopp

1
@Ted: Bu davranış Firefox, Opera ve WebKit'teki platformlar arasında tutarlıdır. IE5 / Mac Çoktan öldüğü için test etmedim, ancak bu tarayıcının IE5 / Win ile birçok farkı var.
bobince
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.