Chr(13) が無視される。

タグの編集
投稿者 bcltaka  (中学生) 投稿日時 2009/12/14 05:44:45
一つおたずねしますが、
Chr(13)

って、「改行」のコードですよね?


2つのテキストボックスに、文字列を打ち込み保存するプログラムです。一方は題名を、もう一方は本文を入力します。
これで、保存ボタンに、
Private Sub btnDataSave_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles btnDataSave.Click

    Dim FilePath As String = "C:\Test\test.txt"
    Dim Data As String = Me.txtTitle.Text & Chr(13) & Me.txtData.Text & Chr(13)

    Dim sw As IO.StreamWriter
    Dim Encode As System.Text.Encoding

    Encode = System.Text.Encoding.GetEncoding("Shift-JIS")

    sw = New IO.StreamWriter(FilePath, True, Encode)
    sw.Write(Data)
    sw.Close()

    MsgBox("保存しました。", MsgBoxStyle.Information, "保存完了")

End Sub

のようにコーディングをしたのですが、保存されたファイルを開くと、「Chr(13)」の部分が無視されて、 txtTitle.Text と txtdata.Text が一続きになっていました。
一番最初にデバッグした時は、うまくいったのですが、2回目からこのような状況になってしまいました。
何か解決策はありませんでしょうか。

お願いします。
投稿者 wii  (中学生) 投稿日時 2009/12/14 06:15:29
とりあえず2005以上らしいけど念のためバージョンを。


でもまあ、
Chr(13)のかわりにvbNewline使えばいいかと。

Private Sub btnDataSave_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles btnDataSave.Click

    Dim FilePath As String = "C:\Test\test.txt"
    Dim Data As String = Me.txtTitle.Text & vbNewline & Me.txtData.Text & vbNewline

    Dim sw As New IO.StreamWriter(FilePath, True,System.Text.Encoding.GetEncoding(932))
        
    sw.Write(Data)
    sw.Close()

    MsgBox("保存しました。", MsgBoxStyle.Information, "保存完了")

End Sub
投稿者 オショウ  (社会人) 投稿日時 2009/12/14 09:01:44
改行と言うことを意味しているのであれば・・・

http://e-words.jp/w/CRLF.html

Chr(13) は、改行ではありません。

因みに、vbCrLf と言う記述もあったかと・・・

以上。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/12/14 23:38:47
>「改行」のコードですよね?
いわゆる改行コードの一種ですが、Windows においては、それ単体では改行を意味しません。
(具体的な修正方法は、既に wii さんが回答されていますね)


=====================
かつての「タイプライター」では、複数行のデータを印刷するときに、
水平印字位置を左端に戻す事(行頭復帰:Carriage-Return)と、
次の行まで用紙を送り出す(行送り/改行:Line-Feed)という
2 つの動作が行われていました。これが現在の改行コードに繋がっています。

CR の方は、文字コードで 0D(16進数)つまり 13 であり、
LF の方は、文字コードで 0A(16進数)つまり 10 で表されます。

Windows においては、この 2 文字を組み合わせた CR+LF を改行として扱います。
Chr(13) つまり CR 単体では改行と看做されませんので注意してください。
(ただしアプリケーションによっては、Cr や Lf 単体でも改行と看做す場合があります)


そして既に回答が付いていますが、VB/VBA/VB.NET では「vbNewLine」という文字列定数にて、
一般的な改行文字を表せるようになっています。
vbNewLine とは、Windows 環境では CR+LF を表す定数であり、Mac 環境では CR を表す定数です。

また、CR や LF や CR+LF その物を表すために、vbCrLf/vbCr/vbLf といった
定数も用意されています(オショウさんが書かれていますね)。また、VB.NET においては
これらと同じ意味を持つ、ControlChars.CrLf などの定数も存在します。


ちなみに Chr や ChrW を使う場合には、『Chr(13) & Chr(10)』という記述によって
改行を表現できます。ただし通常は、vbNewLine や vbCrLf を使った方が良いでしょう。


-------------------
蛇足ですが、Unicode には“広義”の「改行コード」が 8 種類あったりします。
http://www.unicode.org/reports/tr13/tr13-9.html

CR: Carriage Return (キャリッジリターン/復帰)
LF: Line Feed (ラインフィード/改行)
CRLF: Carriage Return + Line Feed (復帰改行)
NEL: Next Line (次行)
VT: Vertical Tabulation (垂直タブ)
FF: Form Feed (フォームフィード/改ページ)
LS: Line Separator (行区切り記号)
PS: Paragraph Separator (段落区切り記号)
投稿者 bcltaka  (中学生) 投稿日時 2009/12/18 02:19:57
ご返答ありがとうございます。

Chr(13) をずっと「改行のコード」だと思い込んでいたのですが、間違いだったようですね。

vbNewLine を使うことにします。 vbCrLf は、後でコードを見直す時に、私だったら「このコード何だっけ?」ということになりかねないので…(笑)

ありがとうございました。
投稿者 (削除されました)  () 投稿日時 2009/12/18 04:23:05
(削除されました)
投稿者 るきお  (社会人) 投稿日時 2009/12/20 01:15:03
ばか^2=?