Ich versuche, Akzente aus Zeichen in der PHP-Zeichenfolge zu entfernen, um die Zeichenfolge in einer URL verwendbar zu machen.
Ich verwende den folgenden Code:
$input = "Fóø Bår";
setlocale(LC_ALL, "en_US.utf8");
$output = iconv("utf-8", "ascii//TRANSLIT", $input);
print($output);
Die Ausgabe, die ich erwarten würde, wäre ungefähr so:
F'oo Bar
Anstelle der transliterierten Zeichen mit Akzent werden sie jedoch durch Fragezeichen ersetzt:
F?? B?r
Alles, was ich online finden kann, zeigt an, dass das Festlegen des Gebietsschemas dieses Problem behebt, aber ich mache dies bereits. Ich habe bereits folgende Details überprüft:
- Das Gebietsschema, das ich einstelle, wird vom Server unterstützt (in der Liste enthalten von
locale -a
) - Die Quell- und Zielcodierungen (UTF-8 und ASCII) werden von der Serverversion von iconv unterstützt (in der Liste enthalten von
iconv -l
) - Die Eingabezeichenfolge ist UTF-8-codiert (überprüft mit der PHP-
mb_check_encoding
Funktion, wie in der Antwort von mercator vorgeschlagen ). - Der Aufruf von
setlocale
ist erfolgreich (er kehrt'en_US.utf8'
eher zurück alsFALSE
)
Die Ursache des Problems:
Der Server verwendet die falsche Implementierung von iconv. Es hat die glibc- Version anstelle der erforderlichen libiconv- Version.
Beachten Sie, dass die iconv-Funktion auf einigen Systemen möglicherweise nicht wie erwartet funktioniert. In diesem Fall ist es eine gute Idee, die libiconv-Bibliothek von GNU zu installieren. Es wird höchstwahrscheinlich zu konsistenteren Ergebnissen führen.
- Einführung des PHP-Handbuchs in iconv
Details zur von PHP verwendeten iconv-Implementierung sind in der Ausgabe der phpinfo
Funktion enthalten.
(Ich kann PHP mit der richtigen iconv-Bibliothek auf dem Server, mit dem ich für dieses Projekt arbeite, nicht neu kompilieren. Die Antwort, die ich unten akzeptiert habe, war die nützlichste, um Akzente ohne iconv-Unterstützung zu entfernen.)
Antworten:
Ich denke, das Problem hier ist, dass Ihre Codierungen ä und å unterschiedliche Symbole für 'a' berücksichtigen. Tatsächlich bietet die PHP-Dokumentation für strtr ein Beispiel zum Entfernen von Akzenten auf hässliche Weise :(
http://ie2.php.net/strtr
quelle
mb_strstr
ist die falsche Funktion, und es gibt keinemb_strtr
Was ist mit der Implementierung von WordPress ?
Um besser zu verstehen, was diese Funktion bewirkt, überprüfen Sie diese entsprechende Konvertierungstabelle hier:
Sie können diese Konvisionstabelle selbst generieren, indem Sie einfach über das
$chars
Array der Funktion iterieren :quelle
Dies ist ein Code, den ich oft gefunden und verwendet habe:
quelle
strtr()
Multibyte nicht bekannt ist, führt diese Funktion zu falschen Ergebnissen, wenn Ihre Skriptdatei in einem Multibyte-Format (z. B. UTF-8) codiert ist.ů, ž, ř, č, ...
UTF-8-freundliche Version der oben von Gino veröffentlichten einfachen Funktion:
Musste dazu kommen, weil mein PHP-Dokument UTF-8-codiert war.
Ich hoffe es hilft.
quelle
Wenn Sie http://php.net/manual/en/book.intl.php zur Verfügung haben, hat dies Ihr Problem gelöst
quelle
Lower()
ist in diesem Fall nicht erforderlichBei Verwendung
iconv
muss das Gebietsschema des Parameters festgelegt werden:Erträge in:
Andere Gebietsschemas als cs_CZ und en_US habe ich nicht installiert und kann es nicht testen.
In C # sehe ich eine Lösung mit Übersetzung in eine Unicode-normalisierte Form - Akzente werden aufgeteilt und dann über eine nicht räumliche Unicode-Kategorie gefiltert.
quelle
Am einfachsten ist es, die
iconv()
native PHP-Funktion zu verwenden.quelle
echo iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', 'usuario o contraseña incorrectos');
Ausgabeusuario o contrase?a incorrectos
setlocale(LC_CTYPE, 'cs_CZ'); echo iconv('UTF-8', 'ASCII//TRANSLIT', "usuario o contraseña incorrectos"); // output: usuario o contrasena incorrectos
. Weitere Informationen finden Sie in der PHP-Dokumentation. Alles ist da! php.net/manual/en/function.iconv.phpIn der Tat ist Geschmackssache. Es gibt viele Möglichkeiten, solche Buchstaben zu konvertieren.
quelle
Sie könnten Urlencode verwenden. Macht nicht ganz das, was Sie wollen (entfernen Sie Akzente), gibt Ihnen aber eine URL-verwendbare Zeichenfolge
In Perl könnte ich einen Übersetzungs-Regex verwenden, aber ich kann mir das PHP-Äquivalent nicht vorstellen
etc...
Sie können dies mit preg_replace tun
(Bitte beachten Sie, dass dies von einem nebligen Bier getippt wurde, das Freitag nach Mittag in Erinnerung ist, daher möglicherweise nicht 100% korrekt ist.)
oder Sie könnten eine Hash-Tabelle erstellen und daraus einen Ersatz erstellen.
quelle
Hier ist eine einfache Funktion, die ich normalerweise benutze, um Akzente zu entfernen:
quelle
Ich stimme dem Kommentar von Georgebrock zu.
Wenn Sie einen Weg finden, // TRANSLIT zum Laufen zu bringen, können Sie benutzerfreundliche URLs erstellen:
$url = preg_replace( '/(\w)[^\w\s](\w)/', '$1$2', $url );
$url = preg_replace( '/[^a-z0-9]+/', '-', $url );
$url = preg_replace( '-'
z'/(?:(^|\-)\-+|\-$)/', '', $url );
Wenn Sie es nicht zum Laufen bringen können, ersetzen Sie setp 1 durch strtr / zeichenbasierte Ersetzung, wie die Lösung von Xetius.
quelle
Ich kann Ihr Problem nicht reproduzieren. Ich bekomme das erwartete Ergebnis.
Wie genau verwenden Sie, um
mb_detect_encoding()
zu überprüfen, ob Ihre Zeichenfolge tatsächlich UTF-8 ist?Wenn ich einfach anrufe
mb_detect_encoding($input)
eine UTF-8- und eine ISO-8859-1-codierte Version Ihrer Zeichenfolge aufrufe, geben beide "UTF-8" zurück, sodass diese Funktion nicht besonders zuverlässig ist.iconv()
gibt mir eine PHP "Benachrichtigung", wenn es die falsch codierte Zeichenfolge erhält und nur "F" wiedergibt, aber das könnte nur an unterschiedlichen PHP / iconv Einstellungen / Versionen (?) liegen.Ich schlage vor, dass Sie zuerst versuchen
mb_check_encoding($input, "utf-8")
, Ihre Zeichenfolge zu überprüfen wirklich UTF-8 ist.Ich denke, das ist es wahrscheinlich nicht.quelle
Die Implementierung von Cazuma Nii Cavalcanti wurde mit der Char-Liste von Junior Mayhé zusammengeführt, in der Hoffnung, einigen von Ihnen Zeit zu sparen.
quelle
Ich habe gerade eine removeAccents-Methode erstellt, die auf dem Lesen dieses und dieses anderen Threads basiert ( Wie entferne ich Akzente und verwandle Buchstaben in "einfache" ASCII-Zeichen? ).
Die Methode finden Sie hier: https://github.com/lingtalfi/Bat/blob/master/StringTool.md#removeaccents
Tests finden Sie hier: https://github.com/lingtalfi/Bat/blob/master/btests/StringTool/removeAccents/stringTool.removeAccents.test.php ,
und hier ist, was bisher getestet wurde:
und es konvertiert nur akzentuierte Dinge (Buchstaben / Ligaturen / Cédilles / einige Buchstaben mit einer Linie durch / ...?).
Hier ist der Inhalt der Methode: ( https://github.com/lingtalfi/Bat/blob/master/StringTool.php#L83 )
quelle
In Laravel können Sie einfach verwenden
str_slug($accentedPhrase)
und wenn Sie sich für Bindestrich (-) interessieren, können Sie diese Methode durch Leerzeichen ersetzenstr_replace('-', ' ', str_slug($accentedPhrase))
quelle
str_slug($word, ' ');
Etwas wie das?
quelle
Wenn die Hauptaufgabe nur darin besteht, die Zeichenfolge in einer URL zu verwenden, warum nicht slugyfier verwenden ?
dann
Es hat auch viele Brücken für beliebte Frameworks. Beispielsweise können Sie das Sluggable- Verhalten von Doctrine Extensions verwenden , um automatisch einen eindeutigen Slug für jede Entität in der Datenbank zu generieren und in der URL zu verwenden.
Wenn Sie nur alle Akzente löschen möchten, können Sie mit Regelsätzen herumspielen , um die Anforderungen zu erfüllen.
quelle
Sie können einen Array-Schlüssel => Wertestil verwenden, um ihn mit strtr () sicher für UTF-8-Zeichen zu verwenden, selbst wenn es sich um Multi-Bytes handelt.
Außerdem speichern Sie die Dekodierung / Codierung im UTF-8-Teil.
quelle
Eine verbesserte Version der
remove_accents()
Funktion gemäß der letzten Version der Wordpress 4.3-Formatierung ist:Meine Antwort ist ein Update der @ dynamic- Lösung, da rumänische oder andere diakritische Sprachen nicht konvertiert wurden. Ich habe die minimalen Funktionen geschrieben und arbeite wie ein Zauber.
quelle
quelle
Basierend auf der Antwort von @Mimouni habe ich diese Funktion verwendet, um Zeichenfolgen mit Akzent in Zeichenfolgen ohne Akzent umzuwandeln.
quelle
Was ist los mit diesem? Funktioniert mit UTF8
Es kann schneller sein, wenn man es nicht benutzt
preg_replace
, aber Geschwindigkeit war hier nicht mein Ziel.quelle
Diese Antwort habe ich hier mit folgenden Tipps, es ist also nicht wirklich meine. Es funktioniert bei mir mit LATIN1 oder UTF-8. Wenn Sie andere Zeichensätze verwenden, sollten Sie diese wahrscheinlich zur
mb_detect_encoding
Funktion hinzufügen . Wahrscheinlich ist auch ein korrekter Umgebungssatz erforderlich.quelle
Fóø Bår
ich habe eigentlich nur bekommenFo? Bar
.ø
Zeichen konnte nicht übersetzt werdeno
. Ich habe versucht, meine Umgebung in no_NO, da_DK zu ändern, aber es hat nicht gestört. Mitsetlocale(LC_CTYPE,'da_DK')
habe ichFo? Baar
.Einer der Tricks, auf die ich im Web gestoßen bin, war die Verwendung von HTML- Eigenschaften und das Entfernen des codierten Zeichens:
Nicht perfekt, aber in einigen Fällen funktioniert es gut.
Sie schreiben jedoch über das Erstellen einer URL-Zeichenfolge, sodass Urlencode und sein Gegenstück- URL- Code möglicherweise besser sind. Wenn Sie eine Abfragezeichenfolge erstellen, verwenden Sie diese letzte Funktion: http_build_query .
quelle
Die Implementierung von WordPress ist definitiv die sicherste für UTF8-Strings. Bei Latin1-Zeichenfolgen erledigt ein einfacher Strtr die Aufgabe, aber stellen Sie sicher, dass Sie Ihr Skript im LATIN1-Format und nicht in UTF-8 speichern.
quelle
quelle