JavaScript文字列の改行文字?


424

ある\nすべてのプラットフォーム用のJavascriptユニバーサル改行文字列は?そうでない場合、現在の環境のキャラクターをどのように決定しますか?

HTMLの改行要素(<BR/>)については質問していません。JavaScript文字列内で使用される改行文字シーケンスについて質問しています。


5
ユーザーが改行で区切られたリストを入力する必要がある複数行の入力コントロールがあります。最初に文字列を改行で分割してリストを解析する必要があります。
ランドンクーン

7
@ landon9720:複数行の入力コントロールの場合、私はを受け取って返すgetValue関数を持っていvalueますvalue.replace(/\r\n/g,'\n')-ブラウザー/プラットフォーム間で出力の一貫性を保つためだけです。
ロイティンカー、

1
特にプログラミングに不慣れな人には良い質問です!HTML以外でもJavaScriptでも、次の行または新しい行に分割する方法を知っているとよいでしょう。
Eric Bishard

チェックアウトnpmjs.com/package/eol
ryanve

回答:


362

この愚かなJavaScriptを使用していくつかのブラウザーをテストしました。

function log_newline(msg, test_value) {
  if (!test_value) { 
    test_value = document.getElementById('test').value;
  }
  console.log(msg + ': ' + (test_value.match(/\r/) ? 'CR' : '')
              + ' ' + (test_value.match(/\n/) ? 'LF' : ''));
}

log_newline('HTML source');
log_newline('JS string', "foo\nbar");
log_newline('JS template literal', `bar
baz`);
<textarea id="test" name="test">

</textarea>

Windows上のIE8とOpera 9が使用します\r\n。私がテストした他のすべてのブラウザ(WindowsではSafari 4とFirefox 3.5、LinuxではFirefox 3.0)はを使用しています\n\n値を設定するとき、それらはすべてうまく処理できますが、IEとOperaはそれを\r\n内部的に再び変換します。呼ばれるいくつかのより多くの詳細をSitePointの記事がありますJavaScriptで行末が

これはHTMLファイル自体の実際の行末とは独立していることにも注意してください(両方\n\r\n同じ結果を与えます)。

フォームを送信すると、すべてのブラウザが改行を%0D%0AURLエンコーディングに正規化します。それを確認するには、eg data:text/html,<form><textarea name="foo">foo%0abar</textarea><input type="submit"></form>をロードして、送信ボタンを押してください。(一部のブラウザーは、送信されたページのロードをブロックしますが、URLエンコードされたフォームの値をコンソールに表示できます。)

とはいえ、あなたが決定することの多くを実際に行う必要はないと思います。改行でテキストを分割したいだけなら、次のようにすることができます:

lines = foo.value.split(/\r\n|\r|\n/g);

14
/ \ r \ n | \ r | \ n / g
AdrianoFerrari 2012

17
@Edsonと間違っています\r\n。1行ではなく2行の改行として扱われるためです。短くしたい場合は、/\r?\n/gたぶんそうするでしょう(とにかくMac OS 9を使っているのは誰ですか?)
メルカトル2013年

1
SitePointの記事は2004年のものなので、そこに記載されている情報は、現在のJS実装に関連していない可能性があります。
cbmanica 2013年

マッチはおそらくスプリットよりもはるかに高速です:jsperf.com/regex-split-vs-match
Wilt

これはやり過ぎのようです。より簡単な解決策については、以下の私の答えを参照してください!
カシム2017年

81

はい、それは普遍的です。

'\n'普遍的である改行文字、あなたは(あなたの入力に応じて、改行文字はキャリッジリターン文字が先行されるかもしれない、ということを念頭に維持する必要があります'\r')。


55
\ nは、ユニバーサルラインフィード文字(LF)です。正確な改行バイトシーケンスは、プラットフォーム(\ r \ n、\ n、または\ r:en.wikipedia.org/wiki/Newline)によって異なります。そしてそれはランドンが求めている問題です。それが普遍的な改行文字であると最初に言い、それからCRが前にあるかもしれないと言うとき、あなたは自分自身に矛盾しています。どちらですか?
メルカトル

2
\ nの前に改行がある場合でも、改行(line feed)文字です。ほとんどのWindows APIやアプリはCRを改行として解析しますが、CRを単独で使用することはできません。LFはWindowsでも同様に機能します。CRは、コンピューターが単なる電子タイプライターであった時代の成果物です。
GolezTrol 2011

3
@GolezTrol CRを単独で使用する正当な理由があります。たとえば、次の行に移動せずに、行を上書きするためにコンソールウィンドウで行の先頭に戻る。これは、コマンドラインユーティリティで変化率の進行状況インジケーターを書き込むためによく使用されます。
Dan Bechard、2015年

2
@ダンフィードバックをありがとう。もちろん、それ自体でCRの申請があるので、「決して」と言ってはいけません。しかし問題は、コマンドラインユーティリティではなく、Javascriptについてです。もちろん、スクリプトがCLIモードで実行されている可能性があります(ただし、CRがそのように機能するかどうかはわかりません)。Javascriptを使用して、コマンドラインで実行されるスクリプトを生成することもできます。これらは規則の例外の可能性がありますが、質問の文脈では適用されないようです。それにもかかわらず、それを言及してくれてありがとう。
GolezTrol

65

「\ n」は使用しないでください。ちょうどこれを試してください:

var string = "this\
is a multi\
line\
string";

バックスラッシュを入力して、トラックインを続けるだけです!魅力のように機能します。


ES6は、tilde文字付きの複数行の値もサポートします(そうでない場合はバックティックと呼ばれます)。
カシム

10
@Qasimは- FYI、私は見、チルダとバッククォートは異なる文字であると信じて~チルダを`バッククォート
クリスバージェス

1
ああ-うん、そうだね。ES6は複数行文字列にバックティック文字を使用します
Qasim

2
合法ではありますが、JSサークルではそれは避けられます。読みやすさに欠ける。可能であれば、ES6のバッククォートを使用してください。そうでない場合、\ n
gotofritz

3
コードを書くときにこれは機能します。OPがtextareaからのテキストを解析することについてであるように見えます。
jinglesthula 2017年

53

どちらのケースをチェックして適用するのではなく、改行文字のすべてのケースを処理するのが最も簡単な場合があります。たとえば、改行を置き換える必要がある場合は、次のようにします。

htmlstring = stringContainingNewLines.replace(/(\r\n|\n|\r)/gm, "<br>");

1
見事。それ以降のバージョンのFFおよびIEで
うまく動作し


13

メールリンク機能「%0D%0A」を使用

function sendMail() {   
var bodydata="Before "+ "%0D%0A";
    bodydata+="After"

var MailMSG = "mailto:aaa@sss.com" 
         + "?cc=07@sss.com" 
         + "&subject=subject" 
         + "&body=" + bodydata; 
window.location.href = MailMSG; 
} 

[HTML]

<a href="#" onClick="sendMail()">Contact Us</a>

誰かがこのタイプのタブキーのコードを知っていますか?「%0D%09」を試しましたが動作しません。
Nilay

7

現在のブラウザーの行セパレーターを取得します。

function getLineSeparator() {
  var textarea = document.createElement("textarea");
  textarea.value = "\n"; 
  return textarea.value;
}

3
いかがreturn textarea.value;ですか?
XP1 2012年

JSON.stringify結果に使用すると、キャラクターが変わりますか?alert()呼び出しで結果を表示しようとした場合、最初に文字列化しない限り、文字は表示されません(もちろん、charは効果的に人間が読める必要があるわけではありません)

4

注-ExtendScript JavaScript(Photoshop CS3 +などのアプリケーションで使用されるAdobe Scripting言語)を使用する場合、使用する文字は「\ r」です。「\ n」はフォント文字として解釈されるため、多くのフォントは代わりにブロック文字を持ちます。

例(「ノート」という名前のレイヤーを選択し、すべてのピリオドの後に改行を追加するには):

var layerText = app.activeDocument.artLayers.getByName('Note').textItem.contents;
layerText = layerText.replace(/\. /g,".\r");

理由を理解しようとしていた\nし、<br/>私のPhotoshopのスクリプトで働いていなかった...ありがとう!
Jake Stoeffler、2014年

3

ES6で ``引用符(Escボタンの下にあります)を使用できます。だからあなたはこのようなものを書くことができます:

var text = `fjskdfjslfjsl
skfjslfkjsldfjslfjs
jfsfkjslfsljs`;

1

私はそれを信じています-あなたがJS文字列で作業しているとき。

ただし、HTMLを生成する場合<br />\n、タグを使用する必要があります(JSを扱っていないため、ではありません)。


1

\ nまたは\ r \ nで改行を表現するのに問題がありました。
魔法のように、復帰に使用される文字\ rは、改行のように機能しました。
したがって、場合によっては、\ rも考慮すると便利です。


これは、文字列にISO-8859-1文字セットがある場合に発生します
CodeBrauer

0
printAccountSummary: function()
        {return "Welcome!" + "\n" + "Your balance is currently $1000 and your interest rate is 1%."}
};
console.log(savingsAccount.printAccountSummary()); // method

プリント:

Welcome!
Your balance is currently $1000 and your interest rate is 1%.

0

実際の観察...私のNodeJSスクリプトには、次の関数があります。

function writeToLogFile (message) {
    fs.appendFile('myserverlog.txt', Date() + " " + message + "\r\n", function (err) {
        if (err) throw err;
    });
}

最初は「\ n」しかありませんでしたが、メモ帳でログファイルを開くと、すべてのエントリが同じ行に表示されていることに気付きました。一方、Notepad ++では、それぞれの行にエントリが表示されます。コードを「\ r \ n」に変更すると、メモ帳でもすべてのエントリが1行に表示されます。


-3

これ\nは、私が遭遇したすべてのケースで問題ありません。私はあなたがウェブで作業し\nているので、それを使用して心配していません(改行に関連する問題が発生していない限り)。


-13

<br/>document.write/document.writeln1つを使用できます。


4
質問をもう一度読んでください。具体的には、彼は質問していないと述べています<br>
リー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.