眾所周知,/r叫回車符,/n叫換行符。
由于歷史原因,windows環境下的換行符是/r/n;(文章最后會稍微解釋這個歷史原因)
linux和html等開源或公開標準中的換行符是/n.
記錄這篇筆記的原因是:
textarea中含換行符時,在C#中接收后自動增加了一個/r符號。假設這個字段叫Name nvarchar(50),由于自動增加了一個/r符號,在前臺驗證明明通過了,但是保存到庫的時候會報錯。因為現在的長度是51.
如果讀者有興趣可以這樣測試:
在<textarea id="name"></textarea>中輸入字符1,然后回車,然后輸入2
在JS中檢測長度得到3,$('#name').val().length===3 is true
在C#中得到長度是4,name.length==4 is true
由于換行符是不可見字符,可以用replace(//n/g,'').length的方法檢測,如在JS中:

可以看到textarea中沒有/r符號。
再看C#中
sqlParams.ElementAt(1).Value.ToString().Replace("/r/n","").Length2sqlParams.ElementAt(1).Value.ToString().Length4可以看到,C#中得到的換行符是有/r的。
故會出現我上門說的這個問題。
解決辦法是:
保存數據之前把/r去掉,replace("/r","");
為什么要這么做?
即使你不去掉/r,讀出來的數據重新顯示在textarea中的時候,換行符又變換成了/n,沒有/r。
這一切的變化都是操作系統和瀏覽器的行為。所以在保存數據庫之前去掉/r是合理的。
在html中顯示只讀文本的時候,別忘了html的換行符是<br/>
所以顯示只讀文本前還要replace('/n','<br/>')。
PS:
windows保留/r/n作為換行符的原因:
回車鍵為什么叫回車鍵,大家有想過沒有,字面意思是回去的車子。
第一臺打印機,每一行打印完了之后在打印第二行之前,這個噴墨的玩意兒需要先回到這一行的行首,這叫回車,然后跳到下一行,這才叫換行。/r/n就是回車加換行。反正保留和延續傳統,就一直把換行叫做回車換行。只有windows平臺下的技術才是這樣的,所有linux和其他開源標準中都是把/n作為換行符。
新聞熱點
疑難解答