it-swarm.com.de

PHP: Ersetzen Sie Umlaute durch nächstgelegene 7-Bit ASCII Äquivalent in einer UTF-8-Zeichenfolge

Was ich tun möchte, ist, alle Akzente und Umlaute von einer Schnur zu entfernen und "lärm" in "larm" oder "andré" in "andre" zu verwandeln. Was ich versucht habe, war, die Zeichenfolge mit utf8_decode zu versehen und dann strtr darauf zu verwenden. Da meine Quelldatei jedoch als UTF-8-Datei gespeichert ist, kann ich keine ISO-8859-15-Zeichen für alle Umlaute eingeben. Der Editor fügt die UTF-8-Zeichen.

Offensichtlich wäre eine Lösung dafür ein Include, das eine ISO-8859-15-Datei ist, aber es muss einen besseren Weg geben als ein anderes erforderliches Include.

echo strtr(utf8_decode($input), 
           'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ',
           'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');

UPDATE: Vielleicht war ich ein bisschen ungenau bei dem, was ich versuche zu tun: Ich möchte die Umlaute eigentlich nicht entfernen, sondern sie durch ein "ASCII-Äquivalent" ersetzen.

40
BlaM
iconv("utf-8","ascii//TRANSLIT",$input);

Erweiterte Beispiel

51
Vinko Vrsalovic

Ein kleiner Trick, für den es nicht erforderlich ist, Gebietsschemas festzulegen oder große Übersetzungstabellen zu verwenden:

function Unaccent($string)
{
    if (strpos($string = htmlentities($string, ENT_QUOTES, 'UTF-8'), '&') !== false)
    {
        $string = html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|Grave|lig|orn|ring|slash|tilde|uml);~i', '$1', $string), ENT_QUOTES, 'UTF-8');
    }

    return $string;
}

Die einzige Voraussetzung für eine einwandfreie Funktion ist das Speichern Ihrer Dateien in UTF-8 (wie Sie es bereits sollten).

26
Alix Axel

sie können dies auch versuchen

$string = "Fóø Bår";
$transliterator = Transliterator::createFromRules(':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: Lower(); :: NFC;', Transliterator::FORWARD);
echo $normalized = $transliterator->transliterate($string);

sie müssen jedoch http://php.net/manual/de/book.intl.php zur Verfügung haben

5
gabo

Okay, ich habe selbst eine offensichtliche Lösung gefunden, aber die Leistung ist nicht die beste ...

echo strtr(utf8_decode($input), 
           utf8_decode('ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'),
           'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');
0
BlaM

Für arabische und persische Benutzer empfehle ich diesen Weg, um Diakritika zu entfernen:

    $diacritics = array('َ','ِ','ً','ٌ','ٍ','ّ','ْ','ـ');
    $search_txt = str_replace($diacritics, '', $diacritics);

Zum Eingeben von diakritischen Zeichen in arabischen Tastaturen können Sie diese Asci-Codes (diese Codes sind Asci und nicht Unicode) in Windows-Editoren Verwenden. Geben Sie diakritische Zeichen direkt ein oder halten Sie Alt + (geben Sie den Code des diakritischen Zeichens ein)

(0243) (0246) (0245) (0240) (0242) (0241) (0250) (0248) (0248). (0220)

0
ganji

Ich fand heraus, dass dieses die konsistentesten Ergebnisse auf Französisch und Deutsch liefert. Mit dem Meta-Tag auf utf-8 habe ich es in eine Funktion geschrieben, um eine Zeile aus einem Array von Wörtern zurückzugeben, und es funktioniert perfekt .

htmlentities (  $line, ENT_SUBSTITUTE   , 'utf-8' ) 
0
jay

Wenn Sie WordPress verwenden, können Sie die integrierte Funktion remove_accents( $string ) verwenden.

https://codex.wordpress.org/Function_Reference/remove_accents

Ich habe jedoch einen Fehler festgestellt: Er funktioniert nicht bei Zeichenketten mit einem einzelnen Zeichen.

0
youtag