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öhen E_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

Schreibe einen Kommentar