1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PHP Laravel 文字コード変換

Last updated at Posted at 2025-07-02

PHPで文字コード変換

初投稿です。
主に備記録として投稿していこうかなと思っています。
もし何かアドバイス等あればぜひお願いします!!

PDFをダウンロードすると文字化けしてしまう。

PDFのデータ自体は、DB上から取得して表示することはできるが、
PDFの名前に日本語を使ってしまうと文字化けしてしまう。

文字化けPDF.png

原因は文字コード

PHPのPDFダウンロードは、基本的にUTF-8というデファクトスタンダードな文字コードによって変換される。そのため、OSの設定によっては文字化けを起こしてしまうのが原因だと分かる。

解決方法1

OSの文字コード設定をUTF-8にするやり方です。
基本的にWindowsの文字コード設定はCP932という、ShiftJISを拡張した文字コードに
設定されています。
OSはCP932に設定されていてUTF-8形式でPDFダウンロードをする → 文字化け
が起こるので、OSの設定をUTF-8にすれば良い話です。

  • ★手順★
    コントロールパネル>>時計と地域>>地域>>管理タブ>>システムロケールの変更
    から設定ができます。
    現在のシステムロケールは、日本語になっていると思うのでそのまま。
    下のUnicode UTF-8 を使用というチェックボックスをチェックします。
    UTF-8に設定.png

これで設定は終了です。
ちなみに反映には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に変換することができました。
pdf成功例.png
いい感じですね!
でも、手順1の方が分かりやすい気もしました。

まとめ

個人なりの見解ですが、解決方法2を採用していた理由としては、
サイトを利用するお客様先のPC設定がデフォルト設定なのでCP932を基準
とする実装なのではないかと思いました。
個人で開発する分にはPCの設定を変えてしまった方が楽ですし、
VScodeとかのデバッグ・出力もUTF-8に設定すると文字化けがなくなったりします。
でもそうするとプロンプトのフォントがなぜかちょっと粗くなります。。。

ありがとうございました。
これからも頑張ります。

1
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?