Transkribieren Sie alle konvertierbaren utf8 Zeichen in ASCII Äquivalente
Gibt es eine gute Lösung gibt, das dies tut transliteration in einer guten Art und Weise?
Ich habe versucht, mit iconv()
aber ist sehr ärgerlich und es verhält sich nicht wie man vielleicht erwarten würde.
- Mit
//TRANSLIT
versuchen zu ersetzen, was Sie können, so dass alles nicht Konvertible "?" - Mit
//IGNORE
nicht verlassen wird "?" im text, aber auch nicht transliterate und wird auch erhöhenE_NOTICE
wenn nicht Konvertible char gefunden, so verwenden Sie iconv mit @ error suppressor - Mit
//IGNORE//TRANSLIT
(wie einige Leute vorgeschlagen, in PHP forum) ist eigentlich dasselbe wie//IGNORE
(versuchte es mir auf der php-Versionen 5.3.2 und 5.3.13) - Auch mit
//TRANSLIT//IGNORE
ist die gleiche wie//TRANSLIT
Es verwendet auch die aktuelle "locale" - Einstellungen zu transliterate.
ACHTUNG - viel text und code ist folgende!
Hier sind einige Beispiele:
$text = 'Regular ascii text + čćžšđ + äöüß + éĕěėëȩ + æø€ + $ + ¶ + @';
echo '<br />original: ' . $text;
echo '<br />regular: ' . iconv("UTF-8", "ASCII//TRANSLIT", $text);
//> regular: Regular ascii text + ????? + ???ss + ?????? + ae?EUR + $ + ? + @
setlocale(LC_ALL, 'en_GB');
echo '<br />en_GB: ' . iconv("UTF-8", "ASCII//TRANSLIT", $text);
//> en_GB: Regular ascii text + cczs? + aouss + eeeeee + ae?EUR + $ + ? + @
setlocale(LC_ALL, 'en_GB.UTF8'); //will this work?
echo '<br />en_GB.UTF8: ' . iconv("UTF-8", "ASCII//TRANSLIT", $text);
//> en_GB.UTF8: Regular ascii text + cczs? + aouss + eeeeee + ae?EUR + $ + ? + @
Ok, das wusste konvertieren č ć š ä ö ü ß é ĕ ø û ë ȩ und æ, aber warum nicht đ und ö?
//now specific locales
setlocale(LC_ALL, 'hr_Hr'); //this should fix croatian đ, right?
echo '<br />hr_Hr: ' . iconv("UTF-8", "ASCII//TRANSLIT", $text);
//wrong > hr_Hr: Regular ascii text + cczs? + aouss + eeeeee + ae?EUR + $ + ? + @
setlocale(LC_ALL, 'sv_SE'); //so this will fix swedish ø?
echo '<br />sv_SE: ' . iconv("UTF-8", "ASCII//TRANSLIT", $text);
//will not > sv_SE: Regular ascii text + cczs? + aouss + eeeeee + ae?EUR + $ + ? + @
//this is interesting
setlocale(LC_ALL, 'de_DE');
echo '<br />de_DE: ' . iconv("UTF-8", "ASCII//TRANSLIT", $text);
//> de_DE: Regular ascii text + cczs? + aeoeuess + eeeeee + ae?EUR + $ + ? + @
//actually this is what any german would expect since ä ö ü really is same as ae oe ue
Können versuchen, mit //IGNORE
:
echo '<br />ignore: ' . iconv("UTF-8", "ASCII//IGNORE", $text);
//> ignore: Regular ascii text + + + + + $ + + @
//+ E_NOTICE: "Notice: iconv(): Detected an illegal character in input string in /var/www/test.server.web/index.php on line 49"
//with translit?
echo '<br />ignore/translit: ' . iconv("UTF-8", "ASCII//IGNORE//TRANSLIT", $text);
//same as ignore only> ignore/translit: Regular ascii text + + + + + $ + + @
//+ E_NOTICE: "Notice: iconv(): Detected an illegal character in input string in /var/www/test.server.web/index.php on line 54"
//translit/ignore?
echo '<br />translit/ignore: ' . iconv("UTF-8", "ASCII//TRANSLIT//IGNORE", $text);
//same as translit only> translit/ignore: Regular ascii text + cczs? + aouss + eeeeee + ae?EUR + $ + ? + @
Mit die Lösung dieser Kerl funktioniert auch nicht wie gewollt: Regular ascii text + YYYYY + aous + eYYYeY + aoY + $ + � + @
Sogar mit PECL intl Normalizer - Klasse (die nicht awailable immer, auch wenn Sie PHP - > 5.3.0, da ICU-Paket intl verwendet möglicherweise nicht verfügbar, PHP, d.h. auf bestimmte hosting-Server) erzeugt Falsches Ergebnis:
echo '<br />normalize: ' .preg_replace('/\p{Mn}/u', '', Normalizer::normalize($text, Normalizer::FORM_KD));
//>normalize: Regular ascii text + cczsđ + aouß + eeeeee + æø€ + $ + ¶ + @
Also gibt es eine andere Möglichkeit, dies zu tun, Recht oder die einzige richtige Sache zu tun ist zu tun preg_replace()
oder str_replace()
definieren und transliteration Tabellen selbst?
//Anhang:
Gefunden habe ich die ZF-wiki-Debatte von 2008 über Vorschlag für Zend_Filter_Transliterate aber das Projekt wurde fallen gelassen, da in einigen Sprachen ist es nicht möglich, zu konvertieren (z.B. Chinesisch), aber immer noch für jede Latein - und cyrilic-basierte Sprache, mit der IMO diese option sollte vorhanden sein.
InformationsquelleAutor der Frage Ivan Hušnjak | 2012-11-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die toAscii () - Funktion von Patchwork - \Utf8 tut genau das, Sie sehen:
https://github.com/nicolas-grekas/Patchwork-UTF8/blob/master/src/Patchwork/Utf8.php
Es nutzt die iconv-und intl - Normalizer zum entfernen von Akzenten, split Ligaturen und viele andere generische Transliterationen.
InformationsquelleAutor der Antwort Nicolas Grekas
Vom diese websiteich etwas gefunden, das könnte helfen :
Beispiel :
Zeigt :
Werden Sie brauchen, um es zu verbessern, aber Sie bekommen die Idee... Wenn es einen direkten Weg zu tun, so eine Arbeit, ich weiß es nicht.
InformationsquelleAutor der Antwort Alain Tiemblo
Als keine der oben genannten Lösungen gearbeitet, für mich (ich brauchte, um transliterate vielen europäischen Zeichensätze, ASCII), fand ich endlich dieses alte PECL-Paket, das einfach zu funktionieren schien http://derickrethans.nl/projects.html#translit . Ich hatte Probleme vor allem mit dem kyrillischen Zeichen setzt, und dies scheint, um Sie zu behandeln perfekt.
InformationsquelleAutor der Antwort user3914203
Wenn ich Sie richtig verstanden habe, kann ich eine Antwort für dich: ich habe geschrieben eine einfache PHP-Klasse, die Ihnen erlaubt, konvertieren Sie die meisten Zeichen in Ihre ASCII-äquivalente.
Unten ist ein screenshot der Ausgabe konvertieren von verschiedenen Komponisten-Namen mit Akzenten in Ihrem Namen.
Können Sie die Gabel es von github hier https://github.com/LukeMadhanga/transliterator.
NB: Es ist noch Undokumentiert, aber es sollte p*** leicht in den Griff zu bekommen.
InformationsquelleAutor der Antwort Luke Madhanga
Ich denke, die richtige locale-Einstellung ist der Weg zu gehen. Beachten Sie, dass die spezifische locale muss auch auf dem system verfügbar, überprüfen Sie mit
locale -a
. Wenn Sie nurde_DE.utf8
- auch Sie haben zu verwenden set_locale(de_DE.utf8
)InformationsquelleAutor der Antwort Alex