|
■No85715 (とっちゃん さん) に返信 > さらに言うと、SetWindowText(WM_SETTEXTメッセージ)には改行に関する規定はありません。
API 絡みだと、ワードラップによる折り返しを「CR+CR+LF」にするための EM_FMTLINES によるソフト改行モードとか、EM_GETTEXTEX による GT_USECRLF / GT_DEFAULT モードの切り替えなどが見つかりました。
しかし、MessageBox API での改行に関する情報は見当たらず…。orz
WM_SETTEXT の規定が見つからないので、このへん、意外と未定義っぽいですね。 複数行モードの EDITBOX と MessageBox で動きが異なるのも、歴史的な経緯によるものなのかな…。
> クリップボードに張り付けると \r\n になっているのは、よくわからないですがそういう仕様だからです。 とはいえ、SetClipboardData API 自体はコードを変換したりするわけでは無さそうですし、 どのようなバイナリとしてセットされるのかは、転送元の実装次第ですよね。
>> MessageBox.Show("/LF=\n/CR=\r/CRLF=\r\n/LFCR=\n\r/LS=\u2028/PS=\u2029/End");
上記と同じ文字列を TextBox に渡してみた場合は、"\r\n" の場所でしか改行されませんでした。 クリップボードに送られる内容も、"\r" 部は U+000D、"\n" 部は U+000A のままでした。 個人的には、MessageBox にも同じ仕様を期待していたのですけれどね。
一方、RichTextBox だとさらに動きが変わって、クリップボードの内容が リッチテキストパート 2個の物理改行になったもの: "\n\r" 1個の物理改行になったもの: "\n", "\r", "\r\n", "\u2029" 1個のソフト改行になった物: "\u2028" プレーンテキストパート U+000D,U+000A になったもの: "\n", "\r", "\r\n", "\u2029", "\u2028" U+000D,U+000A,U+000D,U+000A: "\n\r" という結果になるようです。
■No85719 (furu さん) に返信 > 古い人間なので、プリンタに送るイメージが強く > CR(復帰)だけとかLF(改行)だけだと気持ち悪いです。
自分も CR+LF で無いと落ち着かない派です。 (自分も古い人間…ってことですかね orz)
> 定義されているEnvironment.NewLineを使用しています。
エラーメッセージ内に改行が含まれる場合、改行コードとして CR+LF を使うライブラリと CR を使うライブラリと LF を使うライブラリが あるので、出力前に Environment.NewLine に統一するために
msg = (msg ?? "").Replace("\r\n", "\n").Replace('\r', '\n').Replace("\n", Environment.NewLine);
のような整形処理を入れています。
ただ、ファイルやデータベースに残す場合はこれで良いのですが、 MessageBox として表示する場合、先述のように NewLine が U+000D,U+000D,U+000A になってしまう点が問題になります。 (EM_FMTLINES のソフト改行と同じコードですね)
なので、MessageBox への出力が必要な場合に限定して、 NewLine ではなく \n に変換して対処していたりします。正直面倒…。
|