CSVと文字コード – BOM付utf8で文字化け回避
代表の西村です!久々にブログ書きます。
Excelでの文字化けを防ぐためにBOMつけました。
learningBOXは多言語対応しているLMSです
弊社のeラーニングシステムである「learningBOX」は多言語対応しているLMSです。learningBOXのUIは、現時点では日本語と英語しか選択できませんが、教材のデータや学習者の解答は日本語と英語だけでなく、中国語、韓国語、ベトナム語など世界中の言語に柔軟に対応しております。
実際に、外国人向けの研修などでは、各国の言語で作成した教材が利用されています。
CSVの多言語対応に不備がありました
多言語対応を謳っているにも関わらず、CSV対応に不備がありました。現在リリースされているバージョン (2.14.28) では、CSVのエンコードがShift_JIS(Windows-31J)に固定されています。
そのため、日本語、英語、そして、一部の中国語やラテン系の文字以外は文字化けしてしまいます。
UTF-8を選べるように実装しました
learningBOXから出力するCSVの文字コードをUTF-8に切り替える案もあったのですが、突然仕様変更をすると利用者への影響が大きいと判断し、CSVの文字コードをUTF-8とShift_JISから選択できるようにしました。(デフォルトはShift_JIS)
目次に戻るExcelでの文字化けを防ぐためにBOMをつけました
ExcelでBOM無しUTF-8のCSVを開くと文字化けします。BOMとは「バイトオーダーマーク(Byte Order Mark)」の略で、ファイルの文字コードが「UTF-8」であることを示します。
従って、BOM付のUTF-8とすることで、Excelで文字化けせずに開けるようになりました。
※一昔前はUTF-16LEで作ることで文字化けを回避するのが一般的でしたが、比較的最近のExcelはBOM付utf8でよくなったそうです。また、Webの世界の文字コードはutf8に統一されつつあること、Excel以外での取り扱いやすさを考慮し、UTF-16LEではなく、utf8としました。
参考サイト:Win/Mac どちらの Excel でも正しく開ける Unicode な csv の出力方法
目次に戻るPHPでBOMをつける方法
BOMの実体は、3バイトのデータで「\xEF\xBB\xBF」と表現されます。この3バイトをファイルの先頭に就けることでBOM付のutf8のファイルになります。PHPの場合は以下のようにすることで、BOM付になります。
$csv = "\xEF\xBB\xBF".$csv;
リリース予定
検証結果によりますが、来週もしくは再来週のアップデートでリリースされる見通しです。
learningBOXのリリース状況については、こちらのリリースノートをご覧ください。
learningBOX開発者を募集中!
弊社では、learningBOX開発者を募集しております。バックエンドエンジニア、フロントエンドエンジニア、品質保証エンジニア、プロジェクトマネージャーなど各種募集枠があります。
開発系のエンジニアはたつの本社を中心とした募集ですが、インフラ系エンジニアは、東京でも積極募集しておりますので、興味あるかたは是非ご応募ください。AWSでLinuxのサーバ運用の経験がある方を歓迎しますが、AWSの経験がなくてもLinuxの運用経験があったり、インフラ系の学校でLinuxやネットワークの勉強をされた方であれば、歓迎できそうです!
learningBOX株式会社の採用情報については、こちらをご覧ください。