0D 0D 0A の呪い | vicのブログ

vicのブログ

ツール系やソフト開発について書こうと思っています。
書き込み大歓迎です。
間違いとかもっといい方法とかあったらご指摘いただけるとありがたいです。
質問をいただいたら、記事をもっとわかりやすく変更します。

アプリケーションの処理によって、
改行は2パターン(バイトデータ)

「 0D 0A 」(テキストデータ管理の基本)

「 0A 」(バイナリ時の1バイトでの改行)


しかし、クリップボードのテキストデータを保存するC++のプログラムを作成して分かったのだが、

クリップボード(コピー&ペーストのコピーしたときのバッファ)の形態のフォーマットはいくつもあり、
テキストデータを、
テキストデータ( sprintf など)としてメモリーをコピーしようとしたら、改行でバグのような状況になる。

勝手にデータを改変してしまうのだった。

0A => 0D 0A

つまり、テキストデータの改行は、

¥n = 0D 0A   なので
↓↓勝手に変換
0D 0D 0A


つまり、アメブロ以外でも、コピペで
ブログなどでの多く改行してしまうバグは以下のような感じか?

クリップボードのテキストデータを、貼り付けしようとすると、

テキストデータなのに、貼り付ける側はバイナリと認識する
↓↓↓
\n = 0D 0A > 0D 0D 0A     と変換する
↓↓↓ 
0D が2回続くので、2回改行と判断してしまい、表示の改行が2倍の量になる


プログラムでテキストのクリップボードのデータを、sprintf でバッファにコピーすると
同様なことが起きる。( 0A => 0D 0A)
¥n => 0D 0D 0A
クリップボードのテキストデータなのにバイナリと判断してテキストデータに直して
余計なデータを追加してしまう。


結論:
テキストデータ管理は他にも何かありそうなので、
基本はバイナリで管理して、
バイナリで保存する。
EOFや改行は自分で管理する。

テキストデータ管理関数は、勝手にデータを書き直すので使わない方が良い。
もしくは、テキストデータの場合、以下を注意する
●改行コード
●EOF処理
●文字数にNULLが含まれているかの確認