PHP, nasıl HFS + vs başka bir yerde kodlanmış dosya farkı ile anlaşma yapmak?

3 Cevap php

Ben arama veritabanı satırda bir dosya adı ile bir metin dosyası çok basit bir dosya arama, oluşturma. Veritabanı PHP ile inşa edilmiştir, ve maçlar dosyasını (aynı zamanda PHP ile) grepping tarafından bulundu.

Bu Linux harika çalışıyor, ama [Mac üzerinde non-ASCII karakter kullanıldığında değilken] [1]. Isimler üzerinde örneğin daha HFS + (MacOSX) üzerinde farklı kodlanmış gibi görünüyor ext3 (Linux). İşte dnm.php bulunuyor:

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

print "$mystring\n$filename\n";

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

MacOSX çalıştırdığınızda:

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

Linux (veya MacOSX nfs monte ext3 dosya üzerinde) çalıştırdığınızda:

$ touch abcóüÚdefå
$ php test.php
abcóüÚdefå
abcóüÚdefå
equal
$ php test.php |cat -evt
abcM-CM-3M-CM-<M-CM-^ZdefM-CM-%$
abcM-CM-3M-CM-<M-CM-^ZdefM-CM-%$
equal$

Bu komut dönüşünü her iki platformda da "eşit" yapmak için bir yolu var mı?

3 Cevap

Süre most other systems use NFC MacOSX, UTF-8 kodlamak için normalleştirme biçimi D (NFD) kullanır.

NFC NFD vs

(from unicode.org)

several implementations NFD üzerinde NFC dönüşüm vardır. İşte Normalizer class NFD dizeleri algılamak ve NFC onları dönüştürmek için PHP kullandım. PHP 5.3 veya PECL Internationalization extension aracılığıyla ulaşılabilir.

if (!normalizer_is_normalized($str)) {
   $str = normalizer_normalize($str);
}

Mac OS X / HFS + karakter kombinasyonlarını yerine tek karakterlerini kullanıyor görünüyor. Yani ó (U +00 F3) yerine (AKUT ACCENT BİRLEŞTİRİLMESİ, U + CC81) o (U 006 F) + ´ olarak kodlanmıştır. Ayrıca bkz Apple’s Unicode Decomposition Table.

Eğer iki sistem aynı dili kullanmak olduğunu kontrol ettiniz mi?

Her iki sistemde kullanarak PHP komut dosyası nedir kodlama?

Ben de strcmp yerine eşittir operatörü kullanarak denemek istiyorum. Ben eşittir operatör dahili strcmp kullanıyorsa emin değilim, ama bu durumda test etmek için basit bir şey.