Frage

Ich erstelle eine sehr einfache Datei zu suchen, wo die Suchdatenbank eine Textdatei pro Zeile mit einem Dateinamen ist. Die Datenbank wird mit PHP gebaut, und Spiele werden von greppen die Datei (auch mit PHP).

gefunden

Dies funktioniert gut in Linux, aber nicht auf Mac, wenn nicht-ascii Zeichen verwendet . Es sieht aus wie Namen codiert werden unterschiedlich auf HFS + (Mac OS X) als auf z.B. ext3 (Linux). Hier ist eine 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";

Bei der Ausführung 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$

Bei der Ausführung auf Linux (oder auf einem nfs-mounted ext3-Dateisystem auf Mac OS X):

$ 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$

Gibt es eine Möglichkeit, dieses Skript return „equal“ auf beiden Plattformen zu machen?

War es hilfreich?

Lösung

MacOSX verwendet Normalisierungsform D (NFD) UTF-8 zu kodieren, während meisten andere Systeme verwenden NFC .

NFC vs NFD

( von unicode.org )

Es gibt mehr Implementierungen auf NFD zu NFC-Konvertierung. Hier habe ich die PHP Normalizer Klasse verwendet NFD Strings zu erkennen und wandeln sie NFC. Es ist in PHP 5.3 oder über die PECL Internationalisierung Erweiterung . Die folgende Änderung wird das Skript Arbeit machen:

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

Andere Tipps

Es scheint, dass Mac OS X / HFS + Zeichenkombinationen anstelle von einzelnen Zeichen verwendet. So ist die ó (U + 00F3) anstelle codiert als o (U + 006F) + ´ (U + CC81, COMBINING ACUTE ACCENT). Siehe auch Apples Unicode Zersetzung Tabelle .

Haben Sie überprüft, dass beide Systeme die gleiche Gebietsschema verwenden?

Welche Codierung ist der PHP-Skript auf beiden Systemen verwenden?

Ich würde auch versuchen, mit strcmp anstelle des Gleichheitsoperator. Ich bin mir nicht sicher, ob der Gleichheitsoperator strcmp intern verwendet, aber es ist eine einfache Sache in Ihrem Fall zu testen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top