開発規約

テキストモードとバイナリモードの区別を明確にする。(改行コードの取り扱い)

  • カテゴリ: コーディング

内容

  • テキストモードとバイナリモードがどうしてあるのかというと、環境により改行コードが異なるのが発端である。→文字化け#cd8a76a0
    • 本来はさらに「文字コード列」として見るか「バイナリ列」として見るかの違いがある。これは文字コード変換で問題となる。
    • 文字コードとみなされると余計な変換やフィルタがかかる可能性がある。
  • 一般に、テキスト処理を行うことがほとんどなので、テキストモードがデフォルト。(例外に注意)
    • 一般に、標準入出力はテキストモードになっている。
    • 一般に、ファイルをオープンするとテキストモードになっている。
  • Unix を使っているとバイナリとテキストの区別をしなくても動いてしまうことが大半なので問題に気がつきにくい。
    • バイナリのファイルをテキストモードで処理する間違いが非常に多い。
    • 他の環境への移植の時に問題となる。
      • (PHPではバイナリモードをデフォルトにすることで移植問題をむりやり解決している。)

C

  • デフォルトはテキストモード。
  • fopen でオープンモードに "b" フラグを付ける。
FILE *fp;
fp = fopen(file, "rb");
  • FILE構造体に対しては fileno でファイルディスクリプタ番号を取得して、setmode で設定する。
FILE *fp;
fp = fopen(file, "r");
...
setmode( fileno(fp), O_BINARY );
  • 標準出力をバイナリモードにする場合は以下のようにする。
setmode( fileno(stdout), O_BINARY );
  • 標準出力のファイルディスクリプタ番号は 1 なので以下でもいいかも?
setmode( 1, O_BINARY );

Perl

  • デフォルトはテキストモード。
  • 標準出力をバイナリモードにする場合は以下のようにする。
binmode(STDOUT);

Ruby

  • デフォルトはテキストモード。
  • open でオープンモードに "b" フラグを付ける。(整数なら File::BINARY)
f = open(filename, "rb")
f = open(filename, File::RDONLY | File::BINARY)
  • オープン済みの IO オブジェクトには IO.binmode を使う。
    • 一度バイナリモードにした後は、テキストモードに戻せない点に注意。
  • 標準出力をバイナリモードにする場合は以下のようにする。
STDOUT.binmode

PHP

  • PHP 4.3.2 以前は出力モードは環境依存 :(
  • PHP 4.3.2 以降はデフォルトの出力モードはバイナリモード(!)
  • テキストモードにするには fopen のオープンモードに "t" フラグを付ける。
  • バイナリモードにするには fopen のオープンモードに "b" フラグを付ける。

Java

  • "\n" は基本的に使わない。
  • BufferedReader を使うと、CR+LF, LF を改行コードとして受け取る。
  • BufferedWriter#newLine、PrintStream#println を使うと、プラットフォームの改行コードで出力する。


You can't write "http://" in comment now.


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-03-09 (火) 09:29:21 (2696d)