Frage

Ich mag Codieren von einem Text erkennen (mit PHP). Zu diesem Zweck verwenden mb_detect_encoding i () Funktion.

Das Problem ist, dass die Funktion zurück unterschiedliche Ergebnisse, wenn ich die Reihenfolge der möglichen Kodierungen mit mb_detect_order ändern () Funktion.

Betrachten Sie das folgende Beispiel

$html = <<< STR
ちょっとのアクセスで落ちてしまったり、サーバー障害が多いレンタルサーバーを選ぶとあなたのビジネス等にかなりの影響がでてしまう可能性があります。特に商売をされている個人の方、法人の方は気をつけるようにしてください
STR;
mb_detect_order(array('UTF-8','EUC-JP', 'SJIS', 'eucJP-win', 'SJIS-win', 'JIS', 'ISO-2022-JP','ISO-8859-1','ISO-8859-2'));
$originalEncoding = mb_detect_encoding($str);
die($originalEncoding); // $originalEncoding = 'UTF-8'

Wenn Sie jedoch die Reihenfolge der Codierungen in mb_detect_order ändern () die Ergebnisse werden anders sein:

mb_detect_order(array('EUC-JP','UTF-8', 'SJIS', 'eucJP-win', 'SJIS-win', 'JIS', 'ISO-2022-JP','ISO-8859-1','ISO-8859-2'));        
die($originalEncoding); // $originalEncoding = 'EUC-JP'


So meine Fragen sind:
Warum ist das passiert?
Gibt es eine Möglichkeit in PHP korrekt und eindeutig kodiert von Text erkennen?

War es hilfreich?

Lösung

Das ist, was ich erwarten würde passieren.

Der Erfassungsalgorithmus wahrscheinlich hält nur versucht, um die Kodierungen Sie in mb_detect_order angegeben und gibt dann die ersten, unter denen die Bytestrom gültig wäre.

Etwas intelligentere erfordert statistische Methoden (ich glaube, maschinelles Lernen häufig verwendet wird).

EDIT: Siehe z dieser Artikel für intelligentere Methoden .

Aufgrund der Bedeutung, die automatische Erkennung charset bereits in großen Internet-Anwendungen wie Mozilla oder Internet Explorer implementiert. Sie sind sehr präzise und schnell, aber die Umsetzung gilt viele domänenspezifischen Kenntnisse in Fall-zu-Fall-Basis. In Bezug auf ihre Methoden im Gegensatz wir auf einem einfachen Algorithmus gerichtet, die gleichmäßig auf alle charset angewendet werden kann, und der Algorithmus basiert auf etablierten Standard Techniken des maschinellen Lernens. Wir untersuchten auch die Beziehung zwischen Sprache und charset-Erkennung, und im Vergleich Byte-basierten Algorithmen und zeichenbasierte Algorithmen. Wir verwenden Naive Bayes (NB) und Support Vector Machine (SVM).

Andere Tipps

Nicht wirklich. Die verschiedenen Kodierungen haben oft große Überlappungsbereiche, und wenn die Zeichenfolge, die Sie untersuchen existiert entirly innerhalb dieser Überlappung, dann beide Codierung sind akzeptabel.

Zum Beispiel utf-8 und ISO-8859-1 sind die gleichen für die Buchstaben a-z. Die Zeichenfolge „Hallo“ würde eine identische Folge von Bytes in beiden Kodierungen hat.

Das ist genau, warum es eine mb_detect_order() Funktion in erster Linie ist, wie es Ihnen erlaubt zu sagen, was Sie würde passieren, wenn es vorziehen, diese Auseinandersetzungen passieren. Möchten Sie, dass "hallo" sein utf-8 oder ISO-8859-1?

Beachten Sie mb_detect_encoding() nicht weiß, was die Daten codiert, ist in. Sie können eine Zeichenfolge sehen, aber die Funktion selbst sieht nur einen Strom von Bytes. Going durch das, muss es erraten, was die Codierung - z.B. ASCII Bytes wäre, wenn nur in dem Bereich 0-127, UTF-8 wäre, wenn es ASCII-Bytes ist und 128+ Bytes, die nur existieren, in Paaren oder mehr, und so weiter.

Wie man sich vorstellen kann, da Zusammenhang ist es ziemlich schwierig, eine Codierung zuverlässig zu erkennen.

Wie rihk sagte, dies ist das, was die mb_detect_order() Funktion ist - Sie sind die Daten wahrscheinlich zu sein, im Grunde Ihre beste Vermutung liefert was. Sind Sie mit UTF-8-Dateien häufig arbeiten? Dann stehen die Chancen, Ihre Sachen nicht wahrscheinlich sind, werden UTF-16, auch wenn mb_detect_encoding() es so, dass erraten kann.

Sie können auch Artefacto prüfen wollen 's Link für eine tiefer gehende Ansicht.

Beispiel Fall : Internet Explorer Anwendungen einige interessante Codierung zu raten, wenn nichts angegeben ist (@link, Abschnitt: ‚Um automatisch eine Website Sprache zu erkennen‘), das seltsame Verhalten auf Webseiten verursacht wird, die in der Vergangenheit gewährt hat kodiert. Sie können sich wahrscheinlich einige amüsante Sachen auf, dass, wenn Sie Google um. Er sorgt für einen schönen Show-Fall, wie auch statistische Methoden fürchterlich nach hinten losgehen können, und warum im Allgemeinen kodieren Mutmaßung ist problematisch.

sieht auf dem ersten charset Eintrag in Ihrem mb_detect_order mb_detect_encoding () und dann in einer Schleife durch die Eingabe $ html passenden Zeichen für Zeichen, ob das Zeichen fällt in dem gültigen Satz von Zeichen für das charset. Wenn jedes Zeichen übereinstimmt, dann gibt es wahr; wenn jedes Zeichen fehlschlägt, geht es weiter zu dem nächsten charset im mb_detect_order () und versucht es erneut.

Wikipedia-Liste der charsets ein guter Ort ist, um die Zeichen zu sehen, dass jeder machen charset.

Da diese charset Werte Überlappung (char x8fA1EF existiert sowohl in der ‚UTF-8‘ und in ‚EUC-JP‘), wird dies als Übereinstimmung betrachtet werden, auch wenn es in jedem Zeichensatz ein ganz anderer Charakter ist. Also, wenn eine der Zeichenwert existiert in einer charset, aber nicht in einem anderen, dann mb_detect_encoding nicht, welche des charsets identifizieren ist ungültig; und die erste charset aus Ihrer Array-Liste zurück, die gültig sein könnte.

Soweit ich weiß, gibt es keine todsichere Methode, einen charset zu identifizieren. PHP „best guess“ -Verfahren kann geholfen werden, wenn man eine vernünftige Vorstellung davon, was charsets Sie wahrscheinlich begegnen, und bestellen Sie Ihre Liste entsprechend auf der Grundlage der Lücken (ungültige Zeichen) in jedem charset. Die beste Lösung ist „wissen“ die charset. Wenn Sie Ihre HTML von einer anderen Seite, sucht die charset Kennung im Header dieser Seite sind Schaben.

Wenn Sie wirklich klug sein wollen, können Sie versuchen und identifizieren, die Sprache, in der die HTML geschrieben, vielleicht trigrams mit oder n-Gramm oder ähnlich wie in diesen Artikel auf PHP / ir.

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