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

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

*

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

関連記事

MarkDownDiagram

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

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

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

Google Apps Script でWebAPIを作ろう

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

【PHP】 全角記号のときmb_strwidthが1を返す

PHPで全角の判断に、mb_strwidthを使っていました。 mb_strwidth == (mb_strlen*2) だったら全角文字、みたいな。 そうしたら、「◎」を入れたらうまくいかないとクラ …

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

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

広告