PHPでは、どのように私は別の場所でHFS +対でエンコードされたファイル名の違いに対処するのですか?

StackOverflow https://stackoverflow.com/questions/773574

質問

私は、検索データベースは、1行に1つのファイル名を持つテキストファイルである非常に単純なファイル検索を、作成しています。データベースは(もPHPで)ファイルをgrepをすることによってPHPで構築され、そしてマッチが発見されています。

これは、Linux上で素晴らしい作品が、ないMacの際に非ASCII文字がに使用されています。名前は、例えば上よりもHFS +(MacOSXの)上で異なって符号化されているように見えますEXT3(Linuxの)。ここでtest.phpをだます:

<?php
$mystring = "abcóüÚdefå";
file_put_contents($mystring, "");
$h = dir('.');
$h->read(); // "."
$h->read(); // ".."
$filename = $h->read();

print "string: $mystring and filename: $filename are ";

if ($mystring == $filename) print "equal\n";
else print "different\n";

のMacOSXを実行すると:

$ php test.php
string: abcóüÚdefå and filename: abcóüÚdefå are different
$ php test.php |cat -evt
string: abcóü?M-^Zdefå$ and filename: abco?M-^Au?M-^HU?M-^Adefa?M-^J are different$

Linux上で実行した場合(またはMacOSXの上のNFSマウントext3ファイルシステム上):

$ php test.php
string: abcóüÚdefå and filename: abcóüÚdefå are equal
$ php test.php |cat -evt
string: abcM-CM-3M-CM-<M-CM-^ZdefM-CM-% and filename: abcM-CM-3M-CM-<M-CM-^ZdefM-CM-% are equal$

両方のプラットフォーム上で「等しい」このスクリプトのリターンを作るための方法はありますか?

役に立ちましたか?

解決

MacOSXはしばらくほとんど、UTF-8を符号化するために正規化形式D(NFD)を使用し他のシステムは、NFC を使用します。

NFD対NFC

からunicode.org の)

がありますいくつかのの<のhref = "https://web.archive.org/web/20130511114752/http://rishida.net/code/showsource.php?source=normalization/n11n.php" のrel = "nofollowをnoreferrer">実装は上にNFCへの変換NFD。ここで私はNFD文字列を検出し、それらを変換するためにPHP ノーマクラスを使用しましたNFCへ。これは、PHP 5.3でまたは PECL国際延長を介して使用可能です。以下の修正は、スクリプトの作業を行います。

...
$filename = $h->read();
if (!normalizer_is_normalized($filename)) {
   $filename = normalizer_normalize($filename);
}
...

他のヒント

Mac OS X / HFS +は、文字の組み合わせの代わりに、単一の文字を使用しているようです。そうó(U + 00F3)の代わりo(U + 006F)+ ´(U + CC81、鋭アクセントを組み合わせる)として符号化されます。参照してください。 AppleのUnicodeの分解表はします。

あなたは両方のシステムが同じロケールを使用することを確認しましたか?

どのようなエンコーディングの両方のシステムで使用してPHPスクリプトです?

私はまた、等号演算子の代わりにのstrcmp に使用しようとするだろう。等号演算子が内部のstrcmpを使用する場合、私はわからないんだけど、それはあなたのケースでテストする簡単なことだ。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top