Digital Acorn

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

PHP プログラミング

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

投稿日:2015-09-07 更新日:

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

ファイルをアップロードして、その日本語名を利用するシステムなのですが、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

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

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

関連記事

Visual Studio CodeでBoW上のPHPをデバッグ

前書き Sublime Text 3を愛用しているんですが、だんだん他のエディタが追いついて、追い抜いて来たような感じがします。 Sublime Textは更新が止まってしまっているので、まあしょうが …

【PHP】ビルトインウェブサーバーで楽々テスト環境

teratailで質問に答えるようになったら、以外にサーバー立てずにテストして、ローカル制限に引っかかっている人が多いので、簡単に立てられるローカルサーバーの構築方法を書いておこうと思います。 まず、 …

エディタに最適なフォント

わたしはsublime text 3を使っています。 フォントをいろいろ探し回っていたんですが、結局「MS ゴシック」に戻ってしまいます。なぜなら、どれもフォントの描画がきれいでなく、横棒と縦棒の太さ …

Google Apps Script でWebAPIを作ろう

Google Apps Scriptを使うと簡単にWeb APIを作ることが出来ます。 準備 まず、Google Drive上からApps Scriptを作れるようにしましょう。 ドライブの左上の「新 …

PHP Toolkit のSoapClientが接続できない

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

広告