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

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

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

関連記事

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

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

実際的なimgタグのalt属性の付け方

HTMLでコーディングするときにimgタグのalt属性をいい加減に付けてしまいがちです。 多くの方はalt属性を「画像が読み込まれなかった時に表示するテキスト」という認識を持っています。 しかしこのa …

MarkDownDiagram

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

【PHP】DBライブラリ 「idiorm」

フレームワークを使うには簡単すぎる、かといってPDOを使ってガリガリ書くのは面倒。 そんな時に役立つライブラリが「idiorm」です。(なんて読むんでしょうか?) GitHubで公開しています。 ht …

HTMLの見出しタグの使い方

HTMLでコーディングしていると見出しタグ(h1とかh2とか)をどのように付けようか迷うことがありませんか? そんなときには文書構造を考えるようにしましょう。