We are ACORN!

プログラムやサーバーの設定など、技術的な記事を載せております。

PHP プログラミング

【PHP】 Macからの日本語名ファイルを正しく扱う

投稿日:2019-02-04 更新日:

久しぶりに仕事ではまりました。

ファイルをアップロードして、その日本語名を利用するシステムなのですが、Macも含まれます。
それで、会社からMac miniを借りてダウンロード、アップロード実験をしていたところ、明らかにおかしい挙動があります。

何とかクラブ == 何とかクラブ

これがイコールにならないのです。調べてみたところUTF-8の正規化方法が違うんだそうです。
なんだそりゃ!
Unicode正規化(Wikipedia)

NFCとNFDという二つの方法があって、LinuxとWindowsではNFC。MacはNFDを採用しているらしいです。
NFDは濁点半濁点を一つの文字として扱い、前の文字と合成して表示します。ブラウザは何の問題もなく表示しますが、データ上は異なるので、イコールとはなりません。

PHPでは標準で対応していないので、プラグインを用いることになります。
php-intlというのがそれです。
使い方はヘルプに書かれている通り。

// UTF-8がNFD正規化の場合NFC正規化に変更
if (Normalizer::isNormalized($filename, Normalizer::FORM_D)) {
  $filename = Normalizer::normalize($filename, Normalizer::FORM_C);
}

こんな風にします。

これで問題解決!

-PHP, プログラミング


comment

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

関連記事

【PHP】WSL vs. Docker vs. Win32 環境別速度

PHPが複数環境で実行できるようになったので、速度を測定してみました。 マシンスペックは マシン Lenovo Thinkpad E460 プロセッサ Core i5-6200U @ 2.40GHz …

PHP Toolkit のSoapClientが接続できない

クライアントがPHPのバージョンを5.4から5.6にアップデートしたそうです。 (そういう時は前もって連絡ください(怒)) その際、エラーが出るというのです。 ログを見ると、 SoapClientの_ …

【WSL】PHPから送信するメールをテキストに保存する

テスト環境で使っていると、PHPのメール送信をテストしたい時があります。 かといって、実際に送信されてしまうと面倒です。 xamppにはmailtodiskというのがあり、メールをディスクに保存してく …

【HTML5】 FormDataオブジェクトがログに出力されない(出力方法追記)

どうも仕様みたいですね。 どうやっても、無理でした。 隠ぺいされたオブジェクトっていうのも気持ち悪いですね。 それをajaxで送る、っていうのも気持ち悪い。 var fd = new FormData …

MarkDownDiagram

マークダウンで画面遷移図などのダイアグラムを作れるツールをブラウザベースで作ってくださった方がおられます。 大変重宝していて、業務で使いまくりです。 https://github.com/wakufa …