• ブログTOP
  • AI・ディープラーニング
  • AR
  • VR
  • WEBサイト
  • WEBマーケティング
  • SEO
  • SNS
  • その他
  • お問い合わせ

ALAKI株式会社

COZIKEEいつまでも使えるTech情報発信ブログ

ExcelでBOM付きが無双するPHPでのCSVの書き出し方

2016年4月8日

  • このエントリーをはてなブックマークに追加

こんばんは、Webプログラマの篠田です。

4月に入り、暖かくなってきましたね。1年のなかでも活動しやすい季節になりましたが睡魔との戦いが最も激しい季節でもありますね。
みなさんも睡魔に負けないようお過ごしください。

さて、前回(私の回の)ご紹介した「BOMの地雷を踏み抜かない正しい文字コードとの接し方」でご紹介した「BOM付きUTF-8」が無双するコードを、ご紹介したいとおもいます。

この記事の目次

  • 1 「BOM付きUTF-8」の無双(?)のコード
  • 2 コード解説(1)
  • 3 さすが「Microsoft Excel」と思いました!
  • 4 「Mac版Microsoft Excel」で表示させる
  • 5 コード解説(2)
  • 6 まとめ

「BOM付きUTF-8」の無双(?)のコード

では早速、下記のコードで「BOM付きUTF-8」のCSVファイルを作ることができます。

BOM付きUTF-8でファイルを書き出す方法
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
$view = "";
    
$list = array(
    array(
        '三石琴乃',
        '田中敦子',
        '榊原良子',
        '池田昌子',
    ),
    array(
        '髙橋孝治',
        '関俊彦',
        '田の中勇',
    ),
);
 
foreach ($list as $value) {
    //配列の内容を「,」区切りで連結する
    $view .= implode(",", $value). "\r\n";
}
 
$view = pack('C*',0xEF,0xBB,0xBF). $view;
 
//「$view」を「koe.csv」ファイルに書き出しする
file_put_contents("koe.csv", $view);

では、ポイントだけ見ていきましょう。

コード解説(1)

ポイントは、「UTF-8」の「BOM」であるコード「0xEF」「0xBB」「0xBF」をカンマ区切りにされた文字列の先頭に連結します。

「0xEF」「0xBB」「0xBF」は特殊なバイナリ文字列として扱わないといけないため通常の文字連結では「BOM」として認識してくれません。

そのため、PHP関数の「pack関数」でバイナリ文字列に変換して連結させます。

「pack関数」の第1引数にある「C*」は「符号なしchar型の繰り返し」という意味になります。

これで書きだされたCSVファイルを「Windows版 Microsoft Excel」で開いてみてください。

綺麗に表示されたのではないですか?
※特殊文字の「髙(ハシゴたか)」も綺麗に表示されていますね。

めでたし、めでたし。

さすが「Microsoft Excel」と思いました!

はい、めでたくなかった方がいるのではないでしょうか。

そう、「Mac版Microsoft Excel」で開いた方は残念な結果になったと思います。

これは完全に盲点だったのですが、どうやらMac版とWindows版では同じMicrosoft Excelでも文字コードの捉え方が違うようです。

さすが「Microsoft Excel」一筋縄ではいかないですねww

解決方法のコードをご紹介しましょう。

「Mac版Microsoft Excel」で表示させる

結論からいうと「BOM付きUTF-8」では無理です!!!

「Mac版Microsoft Excel」で表示させるためには「BOM付きUTF-16LE」という文字コードでかつ「TSV形式」でないとMac、Windows両方で表示可能なファイルを作ることができません。

というわけで下記のコードをご紹介しましょう。

Mac版Microsoft Excelで表示させるためのコード
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
$view = "";
    
$list = array(
    array(
        '三石琴乃',
        '田中敦子',
        '榊原良子',
        '池田昌子',
    ),
    array(
        '髙橋孝治',
        '関俊彦',
        '田の中勇',
    ),
);
 
foreach ($list as $value) {
    //配列の内容を「,」区切りで連結する
    $view .= implode("\t", $value). "\r\n";
}
 
$view = pack('C*',0xFE,0xFF). mb_convert_encoding($view, 'UTF-16LE', 'UTF-8');
 
//「$view」を「koe.csv」ファイルに書き出しする
file_put_contents("koe.csv", $view);

コード解説(2)

ポイントは2箇所です。

作成したファイルがUTF-8であることが前提ですが、PHP関数「
mb_convert_encoding」を使って「UTF-16LE」という文字コードに変換します。

もうこの段階で負けていますが。。。気にせず次に行きましょう。

あとは「BOM」を付けてあげるだけなのですがUTF-8と同じBOMでは効果がありません。

文字コードごとに「BOM」が変わります。

今回は「UTF-16」の「LE(リトルエンディアン)」なのでBOMは「0xFF」「0xFE」になります。
※「LE(リトルエンディアン)」ついては長くなるので割愛

ちなみに「UTF-16のLE」と「UTF-16LE」というのがあるのですがこれは分類上別物になり、「UTF-16LE」の方は「BOM」が付けることができません。

ただ、ややこしいのがPHP関数「mb_convert_encoding」で「UTF-16のLE」というのが「UTF-16LE」に該当します。
※PHP関数「mb_convert_encoding」が取り扱える文字コードはこちら

なので、PHP関数「mb_convert_encoding」で変換した「UTF-16LE」の文字列に「BOM」をつけることができます。

あとは、CSVである「,」をタブを表す「\t」にして配列を連結させます。

出力ファイルの拡張子は「.csv」のままでOKです
※厳密には「.tsv」ですが、それではExcelが反応してくれないので「.csv」で偽装します。

さぁ、これでMacでも綺麗に表示されるはずです!!

まとめ

あまり大きな声では言えませんが、、、「仕様をまとめることはできなかったのか!?」と声を大にして言いたいというきもちですが、胸に閉まっておきたいと思います。

検証は、Mac・Windows両方で見ましょう!
※ちなみにOpenOfficeとかで動かないとかで動かない!というクレームはお断りですw

  • ツイート
  • このエントリーをはてなブックマークに追加

You may also like...

  • 14800708_xl

    古いInternetExplorerを使っていませんか?12日にはサポートが終了しますよ

    8 1月, 2016

  • 14800708_xl

    BOMの地雷を踏み抜かない正しい文字コードとの接し方

    11 3月, 2016

  • メディアで紹介されやすくするための、プレスリリース作成の4つのコツ

    メディアで紹介されやすくするための、プレスリリース作成の4つのコツ

    17 6月, 2016

  • Next story Twitter広告「テレビターゲティング」が面白い!
  • Previous story スポンサードサーチとYDNのいいとこどり!Yahoo!プロモーション広告のサーチターゲティング機能のご紹介

弊社サービス

MONJI+ MUGHEN ALAKI クラウド型受発注システム さよなら過去のAR。WebARがイベント集客に革命を起こします。

運営会社

ALAKI株式会社 ALAKI株式会社採用サイト

人気の記事

  • alaki1462_A_businessman_who_works_logically_1da80a2e-c297-4911-bdd6-feba0ebf1357

    仕事術

    【書籍要約】数学的な仕事術大全

    4 11月, 2024

  • fv-main-img-min

    空間コンピューティング

    世界初!「空間コンピューティング」を専用端末不要、スマホのWebブラウザのみで実現する『Web XR Site』を公開しました

    22 6月, 2023

  • Virtual reality players isometric vector illustration. VR UI and navigation. Futuristic digital technology. Virtual screen. Mixed reality 3d concept. Person in VR headset. Web banner idea

    AR

    Appleから新世代MRグラス「Vision Pro」の登場 – デジタルと現実世界が融合する新時代へ

    6 6月, 2023

  • AWE

    未分類

    ARアプリ『MUGHEN』が世界最大のAR/VRアワード「AWE」のファイナリストに選出されました!

    26 5月, 2023

  • python-logo-master-v3-TM

    pyhotn / 業務効率化

    「SwinIR」で高画質化した画像を pythonを使用して一括で元のサイズに戻す方法

    2 2月, 2023

カテゴリー

  • AI・ディープラーニング
  • AR
  • BtoB
  • CMS
  • Git
  • Google AdWords
  • gulp
  • Javascript
  • Laravel
  • Photoshop
  • Pug
  • pyhotn
  • Sass
  • SEO
  • SNS
  • Twitter広告
  • VR
  • Web3.0
  • WEBサイト
  • WEBマーケティング
  • YouTube
  • コーディング
  • システム開発
  • スマートフォンサイト
  • セキュリティ
  • セミナー
  • その他
  • ツール
  • デザイン
  • ベトナムレポート
  • 仕事術
  • 未分類
  • 業務効率化
  • 空間コンピューティング
  • 色

アーカイブ

  • 2024年11月
  • 2023年6月
  • 2023年5月
  • 2023年2月
  • 2023年1月
  • 2022年12月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年2月
  • 2021年12月
  • 2021年9月
  • 2021年7月
  • 2021年6月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年6月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年11月
  • 2018年9月
  • 2018年8月
  • 2018年7月
  • 2018年6月
  • 2018年5月
  • 2018年4月
  • 2018年3月
  • 2018年2月
  • 2018年1月
  • 2017年12月
  • 2017年11月
  • 2017年10月
  • 2017年9月
  • 2017年8月
  • 2017年7月
  • 2017年6月
  • 2017年4月
  • 2017年3月
  • 2017年2月
  • 2017年1月
  • 2016年12月
  • 2016年11月
  • 2016年10月
  • 2016年9月
  • 2016年8月
  • 2016年7月
  • 2016年6月
  • 2016年5月
  • 2016年4月
  • 2016年3月
  • 2016年2月
  • 2016年1月
  • 2015年12月
  • 2015年11月
  • 2015年10月
  • 2015年9月
  • 2015年7月
  • 2015年3月
  • 2015年2月
  • 2015年1月
  • 2014年12月
  • 2014年11月
  • 2014年10月
  • 2014年9月
  • 2014年8月
  • 2014年7月
  • 2014年6月
  • 2013年10月
  • 2013年9月

Facebook

お問い合わせ

お問い合わせ

人気の記事

  • 【書籍要約】数学的な仕事術大全
  • 世界初!「空間コンピューティング」を専用端末不要、スマホのWebブラウザのみで実現する『Web XR Site』を公開しました
  • Appleから新世代MRグラス「Vision Pro」の登場 – デジタルと現実世界が融合する新時代へ
  • ARアプリ『MUGHEN』が世界最大のAR/VRアワード「AWE」のファイナリストに選出されました!
  • 「SwinIR」で高画質化した画像を pythonを使用して一括で元のサイズに戻す方法

カテゴリー

  • AI・ディープラーニング
  • AR
  • BtoB
  • CMS
  • Git
  • Google AdWords
  • gulp
  • Javascript
  • Laravel
  • Photoshop
  • Pug
  • pyhotn
  • Sass
  • SEO
  • SNS
  • Twitter広告
  • VR
  • Web3.0
  • WEBサイト
  • WEBマーケティング
  • YouTube
  • コーディング
  • システム開発
  • スマートフォンサイト
  • セキュリティ
  • セミナー
  • その他
  • ツール
  • デザイン
  • ベトナムレポート
  • 仕事術
  • 未分類
  • 業務効率化
  • 空間コンピューティング
  • 色

検索

ALAKI株式会社 © 2025. All Rights Reserved.