PHPで文字コード変換
初投稿です。
主に備記録として投稿していこうかなと思っています。
もし何かアドバイス等あればぜひお願いします!!
PDFをダウンロードすると文字化けしてしまう。
PDFのデータ自体は、DB上から取得して表示することはできるが、
PDFの名前に日本語を使ってしまうと文字化けしてしまう。
原因は文字コード
PHPのPDFダウンロードは、基本的にUTF-8というデファクトスタンダードな文字コードによって変換される。そのため、OSの設定によっては文字化けを起こしてしまうのが原因だと分かる。
解決方法1
OSの文字コード設定をUTF-8にするやり方です。
基本的にWindowsの文字コード設定はCP932という、ShiftJISを拡張した文字コードに
設定されています。
OSはCP932に設定されていてUTF-8形式でPDFダウンロードをする → 文字化け
が起こるので、OSの設定をUTF-8にすれば良い話です。
- ★手順★
コントロールパネル>>時計と地域>>地域>>管理タブ>>システムロケールの変更
から設定ができます。
現在のシステムロケールは、日本語になっていると思うのでそのまま。
下のUnicode UTF-8 を使用
というチェックボックスをチェックします。
これで設定は終了です。
ちなみに反映にはPCの再起動が必要です。
解決方法2
PDFのダウンロード形式をCP932にする方法です。
実際、今僕が配属されている案件のコードはこっちでした。
PHPのコード内でファイル名をCP932としてダウンロードする方法です。
※解決方法1の設定をした場合、逆に文字化けします。
- ★手順1★
mb_convert_encoding
という関数を使用して変換
$filePath = 'storage/tmp/sample.pdf';
$fileName = 'sample_計算書_2025.pdf';
// $fileNameをUTF-8からCP932に変換
$fileName = mb_convert_encoding($fileName, 'CP932', 'UTF-8');
// この後下にダウンロード処理を記述
- ★手順2★
stream_filter_prepend
という関数を使用して変換。
$filePath = 'storage/tmp/sample.pdf';
$fileName = 'sample_計算書_2025.pdf';
// $fileNameをUTF-8からCP932に変換
stream_filter_prepend($fileName, 'convert.iconv.utf-8/cp932//TRANSLIT');
// この後下にダウンロード処理を記述
ダウンロード処理に関してはこちらを参照してください。
これで、ファイル名をCP932に変換することができました。
いい感じですね!
でも、手順1
の方が分かりやすい気もしました。
まとめ
個人なりの見解ですが、解決方法2を採用していた理由としては、
サイトを利用するお客様先のPC設定がデフォルト設定なのでCP932を基準
とする実装なのではないかと思いました。
個人で開発する分にはPCの設定を変えてしまった方が楽ですし、
VScodeとかのデバッグ・出力もUTF-8に設定すると文字化けがなくなったりします。
でもそうするとプロンプトのフォントがなぜかちょっと粗くなります。。。
ありがとうございました。
これからも頑張ります。