DOBON.NETプログラミング道掲示板

ツリー一括表示

Nomalアイコン 改行のコード /Vetty (20/10/04(Sun) 06:24) #34546
Nomalアイコン Re[1]: 改行のコード /Azulean (20/10/04(Sun) 08:35) #34548
│└Nomalアイコン Re[2]: 改行のコード /魔界の仮面弁士 (20/10/04(Sun) 12:29) #34549
Nomalアイコン Re[1]: 改行のコード /魔界の仮面弁士 (20/10/04(Sun) 12:58) #34552
  │└Nomalアイコン Re[3]: 改行のコード /Vetty (20/10/04(Sun) 12:53) #34550
  │  └Nomalアイコン Re[4]: 改行のコード /Vetty (20/10/04(Sun) 12:54) #34551 解決み!
  │    └Nomalアイコン Re[5]: 改行のコード /shu (20/10/20(Tue) 16:18) #34565 解決み!
  └Nomalアイコン Re[2]: 改行のコード /魔界の仮面弁士 (20/10/04(Sun) 13:16) #34553


親記事 / ▼[ 34548 ] ▼[ 34552 ]
■34546 / 親階層)  改行のコード
□投稿者/ Vetty 一般人(4回)-(2020/10/04(Sun) 06:24:18)
  • アイコン環境/言語:[Windows10,VB] 
    分類:[.NET] 

    いろいろな場所から情報を集めてくると、改行コードの違いがあります。
    0Ah だけ
    0Dh だけ
    0Dh 0Ah
    0Dh 0Dh 0Ah
    が出てきます・
    また、WEBサイトでは意識的だと思いますが常に2行改行を使っている場合
    もあります。


    これを自分の資料としてテキストファイルにしてデータベース(もどき?)に
    しているのですが、この場合はどのように統一して保管すべきなのでしょうか?
    現在は、表示するときに見やすいように適当に置き換えのルールを決めて
    表示しています。

    0Ah だけ
    0Dh だけ
    0Dh 0Ah

    のどれかにしてしまっていいものでしょうか?


違反を報告
[ □ Tree ] 返信 削除キー/

▲[ 34546 ] / ▼[ 34549 ]
■34548 / 1階層)  Re[1]: 改行のコード
□投稿者/ Azulean 大御所(518回)-(2020/10/04(Sun) 08:35:12)
  • アイコンNo34546に返信(Vettyさんの記事)
    > 0Ah だけ
    > 0Dh だけ
    > 0Dh 0Ah

    0A → LF
    0D → CR
    0D 0A → CR+LF


    > 0Dh 0Dh 0Ah

    これってなんだろう…。


    > これを自分の資料としてテキストファイルにしてデータベース(もどき?)に
    > しているのですが、この場合はどのように統一して保管すべきなのでしょうか?

    結局これらは、改行をどのように符号化するかという話なので、保存するときにどれかに統一することは問題ありません。
    閲覧時、あるいは何らかのアプリケーションの入力する際には改行コードを整える必要があるかもしれません。

    なお、Windows 上では CR+LF に統一することが無難だと思います。
    一部のコントロールでは CR+LF でないと改行表示してくれないので…。
違反を報告
[ 親 34546 / □ Tree ] 返信 削除キー/

▲[ 34548 ] / ▼[ 34550 ]
■34549 / 2階層)  Re[2]: 改行のコード
□投稿者/ 魔界の仮面弁士 大御所(1301回)-(2020/10/04(Sun) 12:29:35)
  • アイコンNo34548に返信(Azuleanさんの記事)
    >>0Dh 0Dh 0Ah
    > これってなんだろう…。

    ワードラップやソフト改行を表す代替文字列として
    使われることがあります。たとえば EM_FMTLINES など。

    Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
      SendMessage(TextBox1.Handle, EM_FMTLINES, IntPtr.Zero, IntPtr.Zero)
      Label1.Text = TextBox1.Text.Replace("\", "\\").Replace(vbLf, "\n").Replace(vbCr, "\r")
      SendMessage(TextBox1.Handle, EM_FMTLINES, New IntPtr(1), IntPtr.Zero)
      Label2.Text = TextBox1.Text.Replace("\", "\\").Replace(vbLf, "\n").Replace(vbCr, "\r")
      SendMessage(TextBox1.Handle, EM_FMTLINES, IntPtr.Zero, IntPtr.Zero)
    End Sub
違反を報告
[ 親 34546 / □ Tree ] 返信 削除キー/

▲[ 34546 ] / ▼[ 34553 ]
■34552 / 1階層)  Re[1]: 改行のコード
□投稿者/ 魔界の仮面弁士 大御所(1302回)-(2020/10/04(Sun) 12:58:15)
  • アイコンNo34546に返信(Vettyさんの記事)
    > この場合はどのように統一して保管すべきなのでしょうか?

    自分の場合、accdb に入れるか、生バイナリのまま保持しておくことが
    多いですが……テキスト形式での保存が必要な場合には

    {テキスト部の文字数(10進数)}{CRLF}{改行入りテキスト本体}{CRLF}

    のように、各テキストの先頭にデータサイズを埋め込んだりしています。

    テキストを手動で書き換える事もある場合は、サイズ埋め込みは面倒なので
    \r や \n で置き換えて単一行にすることもしばしばあります。
    この場合は \\ へのエスケープも必要ですね。


    改行パターンが事前に分からない場合、
    Cr/CrLf/Lf をすべて CrLf に正規化するために
     Dim rawString As String = …
     Dim fmtString As String = rawString.Replace(vbCrLf, vbLf).Replace(vbCr, vbLf).Replace(vbLf, vbCrLf)
    のようなコードを書くこともあります。


    > 0Ah だけ
    > 0Dh だけ
    > 0Dh 0Ah
    > のどれかにしてしまっていいものでしょうか?

    元のバイナリを維持する必要があるかどうか、だと思います。


    たとえば No34549 で紹介した EM_FMTLINES などは、
    [0Dh 0Dh 0Ah] と [0Dh 0Ah] を明確に区別しているため、
    これらの改行コードを統一化してしまうと、
    ソフト改行とハード改行を区別できなくなってしまいます。
    しかし、それを許容できるケースであるのならば問題無いでしょう。


    あるいは RFC1945 で定義された HTTP Header だと、
    長い行の折り返しのために、行末に LWS (Linear White Space) すなわち
    「CRLF(0Ah,0Dh) の後に、SP(20h) または HT(09h) が 1 つ以上続くトークン」
    を付与することになっています。

    この場合、出力側としては【CRLF を使うことが求められる】のですが、
    その一方で、入力側は CRLF の代わりに単独 CR や単独 LF が
    使われることも許容して処理するべきとされています。


    そのほか XML Parser の世界では、XML 1.0 勧告において、
    内部処理のために正規化した【LF のみに統一された文字列】として
    処理することになっています。

    なので、XML の解析処理を行った後は、CR や CRLF が
    LF に変換された出力される可能性が高いです。
    (未加工で出力してくる処理系もあります)
違反を報告
[ 親 34546 / □ Tree ] 返信 削除キー/

▲[ 34549 ] / ▼[ 34551 ]
■34550 / 3階層)  Re[3]: 改行のコード
□投稿者/ Vetty 一般人(5回)-(2020/10/04(Sun) 12:53:12)
  • アイコン魔界の仮面弁士さま 回答ありがとうございます。

    >なお、Windows 上では CR+LF に統一することが無難だと思います。

    ということなので、そうさせていただきます。

    >たとえば EM_FMTLINES など。

    むずかしいことは考えずに、Textboxに表示した場合の見栄えで
    置き換えていくことにします。
違反を報告
[ 親 34546 / □ Tree ] 返信 削除キー/

▲[ 34550 ] / ▼[ 34565 ]
■34551 / 4階層)  Re[4]: 改行のコード
□投稿者/ Vetty 一般人(6回)-(2020/10/04(Sun) 12:54:57)
  • アイコン失礼しました、
    「解決」にするのを忘れました。
解決み!
違反を報告
[ 親 34546 / □ Tree ] 返信 削除キー/

▲[ 34551 ] / 返信無し
■34565 / 5階層)  Re[5]: 改行のコード
□投稿者/ shu 大御所(490回)-(2020/10/20(Tue) 16:18:34)
  • アイコンNo34551に返信(Vettyさんの記事)
    StringBuilderを使ってAppendLineをするのが
    OS標準となるのでよいと思います。
解決み!
違反を報告
[ 親 34546 / □ Tree ] 返信 削除キー/

▲[ 34552 ] / 返信無し
■34553 / 2階層)  Re[2]: 改行のコード
□投稿者/ 魔界の仮面弁士 大御所(1303回)-(2020/10/04(Sun) 13:16:45)
  • アイコンNo34552に追記(魔界の仮面弁士の記事)
    >>0Ah だけ
    >>0Dh だけ
    >>0Dh 0Ah
    >>のどれかにしてしまっていいものでしょうか?
    > 元のバイナリを維持する必要があるかどうか、だと思います。

    なお、メッセージボックスに出力する場合には
    CrLf は使わない方が安全です。


    たとえば VB.NET や Excel VBA から

    Call MsgBox("1行目はCR" & vbCr & "2行目はCRLF" & vbCrLf & "3行目はLF" & vbLf & "さて、どうなるか?", vbInformation)

    とした場合、いずれも 1 つの改行と認識されて 4 行構成で表示されます。

    しかし、メッセージボックス上で Ctrl+C を押して
    テキストの内容をクリップボードに送出した場合、LF → CRLF 変換が入り、
     CR  → 0Dh
     CRLF → 0Dh,0Dh,0Ah
     LF  → 0Dh,0Ah
    という自動変換を伴ってコピーされることになります。

    これをメモ帳などに貼り付けると、CRLF のところが 2 重改行のように
    見えてしまう事でしょう。

    とはいえ、メッセージボックスそのものの表示は問題無いわけですから、
    クリップボードの内容を意識しない場合には、元の改行を意識せず、
    そのまま無加工でメッセージボックスに渡しても問題無いとも言えます。
違反を報告
[ 親 34546 / □ Tree ] 返信 削除キー/


Mode/  Pass/


- Child Tree -