(追記いたしました、よろしくお願いいたします。)
PHPでファイル書き込み(csv出力)の実装をしています。
そこで、なぜかタイトルの通り、出力をされたファイルをテキスト形式(.txt)でみると最初の行の最初に半角スペースが入ってしまっています。
そのため、CSVでも、一行目一列目のみ半角スペースが2つ入ってしまっています。(画像参照)
どうすればこれを無くせるでしょうか。
どうぞ、よろしくお願いいたします。
以下コードと画像になります。
PHP
1 //CSV形式で情報をファイルに出力のための準備 2 $csvFileName = '/tmp/' . time() . rand() . '.csv'; 3 $res = fopen($csvFileName, 'w'); 4 $array=['あ', 'い']; 5 $dataList[] = $array; 6 // ループしながら出力 7 foreach($dataList as $dataInfo) { 8 9 // 文字コード変換。エクセルで開けるようにする 10 mb_convert_variables('SJIS', 'UTF-8', $dataInfo); 11 12 // ファイルに書き出しをする 13 $line = implode(',' , $dataInfo); 14 fwrite($res, $line . "\n"); 15 } 16 fclose($res); 17 18 // ダウンロード開始 19 header('Content-Type: application/octet-stream'); 20 21 // ここで渡されるファイルがダウンロード時のファイル名になる 22 header('Content-Disposition: attachment; filename=sample.csv'); 23 header('Content-Transfer-Encoding: binary'); 24 header('Content-Length: ' . filesize($csvFileName)); 25 readfile($csvFileName);
【追記】
皆さまご回答ありがとうございます。
出力する内容を隠すためにサンプルの内容を入れたり多少変数名を変えたりしておりまして、
その際コード全体として不自然になってしまいました。そのまま投稿したこと申し訳ありません。
以下、その部分も補足しつつご質問の回答と、状態を書きたいと思います。
ご質問内容⓵
「テキストエディタで開くとどうなってますか?もしかしたらバイナリエディタのほうがいいかもしれません?」
⇒以下の画像の通り、テキストエディタで開いても半角スペースが二つ入ってしまっています。また、バイナリエディタで見たところやはり20(半角スペース)が入っておりました。
ご質問内容②
「ひょっとして、phpタグの前になんかはいってませんかね?」
⇒確認いたしましたが、PHPタグの前には何も入っておりませんでした。
ご質問内容③
「ファイルをバイナリエディタで開き、ゴミがどういったコードなのか調べるところからですね
また、多バイト文字ではなくシングルバイト文字ではどうなるか追記ください」
⇒上記の通り、バイナリ表示で20,半角スペースが入っておりました。シングルバイト文字でやってみましたが結果は変わらずでした。
ご質問内容④
「そのファイルがインクルードしたファイルのどこかで <?php の前か?> のあとに空白や改行、タブなどが入っていないか
ファイルをBOMつきで保存してないか」
⇒確認しましたが、そのようなことはありませんでした。
ご質問内容⑤
「phpのコードなのに「<?php」が書いていないことから、
一連の処理の一部分のコードを切り出したものだと推察します。
そして、掲載された箇所のコードでは$dataListの初期化が行われていないことが気になります。
ですが、すでに何らかのデータが含まれているのであれば
「あ」がセルA1の位置に来ない気がするのでしっくりきません。」
⇒はい、その通りでございます。具体的にはwebアプリケーションのあるコントローラー内の処理になります。$dataListの初期化は書き忘れておりました。
「文字エンコーディングをUTF-8からSJISに変換したあとにimplodeにかけているの、逆じゃないでしょうか。」
⇒本当ですね...逆でした。しかしながら、これを逆にして試しましたが結果は変わらずでした...
他に何か解決方法は考えられますでしょうか。
【追記②】
php.iniを調べてみました。
; PHP's default character set is set to UTF-8. ; http://php.net/default-charset default_charset = "UTF-8"
[mbstring] ; language for internal character representation. ; This affects mb_send_mail() and mbstrig.detect_order. ; http://php.net/mbstring.language ;mbstring.language = Japanese ; Use of this INI entry is deprecated, use global internal_encoding instead. ; internal/script encoding. ; Some encoding cannot work as internal encoding. (e.g. SJIS, BIG5, ISO-2022-*) ; If empty, default_charset or internal_encoding or iconv.internal_encoding is used. ; The precedence is: default_charset < internal_encoding < iconv.internal_encoding ;mbstring.internal_encoding = ; Use of this INI entry is deprecated, use global input_encoding instead. ; http input encoding. ; mbstring.encoding_traslation = On is needed to use this setting. ; If empty, default_charset or input_encoding or mbstring.input is used. ; The precedence is: default_charset < intput_encoding < mbsting.http_input ; http://php.net/mbstring.http-input ;mbstring.http_input = ; Use of this INI entry is deprecated, use global output_encoding instead. ; http output encoding. ; mb_output_handler must be registered as output buffer to function. ; If empty, default_charset or output_encoding or mbstring.http_output is used. ; The precedence is: default_charset < output_encoding < mbstring.http_output ; To use an output encoding conversion, mbstring's output handler must be set ; otherwise output encoding conversion cannot be performed. ; http://php.net/mbstring.http-output ;mbstring.http_output = ; enable automatic encoding translation according to ; mbstring.internal_encoding setting. Input chars are ; converted to internal encoding by setting this to On. ; Note: Do _not_ use automatic encoding translation for ; portable libs/applications. ; http://php.net/mbstring.encoding-translation ;mbstring.encoding_translation = Off ; automatic encoding detection order. ; "auto" detect order is changed according to mbstring.language ; http://php.net/mbstring.detect-order ;mbstring.detect_order = auto ; substitute_character used when character cannot be converted ; one from another ; http://php.net/mbstring.substitute-character ;mbstring.substitute_character = none ; overload(replace) single byte functions by mbstring functions. ; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(), ; etc. Possible values are 0,1,2,4 or combination of them. ; For example, 7 for overload everything. ; 0: No overload ; 1: Overload mail() function ; 2: Overload str*() functions ; 4: Overload ereg*() functions ; http://php.net/mbstring.func-overload ;mbstring.func_overload = 0 ; enable strict encoding detection. ; Default: Off ;mbstring.strict_detection = On ; This directive specifies the regex pattern of content types for which mb_output_handler() ; is activated. ; Default: mbstring.http_output_conv_mimetype=^(text/|application/xhtml+xml) ;mbstring.http_output_conv_mimetype=
mbstring関係は全てコメントアウトされていました。また、
;extension=php_mbstring.dll
ともなっておりました。
回答4件
あなたの回答
tips
プレビュー