2016-05-04 6 views
1

ich diese beiden Saiten haben:Convert 2 ähnlich aussehenden deutschen Zeichen verschiedener Arten zu gleichen ASCII-Zeichenfolge in PHP

$str1 = 'Ö'; 
$str2 = 'Ö'; 
$e1 = mb_detect_encoding($str1); 
$e2 = mb_detect_encoding($str2); 
var_dump($str1); 
var_dump($str2); 
echo 'e1: '.$e1.', e2: '.$e2; 

das Ergebnis:

string(3) "Ö" 
string(2) "Ö" 
e1: UTF-8, e2: UTF-8 

Es scheint, dass sie nicht nur Deutsch Zeichen, sondern auch jeder von ihnen ist anders, so konvertieren sie auf diese Weise in ASCII

PHP: Replace umlauts with closest 7-bit ASCII equivalent in an UTF-8 string

führt nicht zu gleichen Ergebnissen. Gibt es eine Möglichkeit, beide Zeichenfolgen in eine dieser ASCII-Formen zu konvertieren BNOE oder BNO?


Ich weiß, dass ich vielleicht Ö von beiden kopieren könnte, und dies in strtr suchen und Array ersetzen, aber ich weiß nicht, wie alle charactes die gleiche Art und Weise sind die ersten Ös codiert zu reproduzieren.

Antwort

1

Sie können Ihre Eingabe zuerst in utf-8 konvertieren, indem Sie iconv verwenden und dann Ihre Konvertierung auf ASCII anwenden. Um die aktuelle Kodierung zu erkennen, können Sie mb_detect_encoding verwenden.

$aUTF8 = iconv(mb_detect_encoding($a, 'UTF-8, ISO-8859-1', true), 'UTF-8', $a); 
$bUTF8 = iconv(mb_detect_encoding($b, 'UTF-8, ISO-8859-1', true), 'UTF-8', $b); 

$aASCII = iconv("utf-8", "ascii//TRANSLIT", $aUTF8); 
$bASCII = iconv("utf-8", "ascii//TRANSLIT", $bUTF8); 

Bitte beachten Sie, dass Sie zusätzliche Codierungen auf die Codierung Liste der mb_detect_encoding hinzufügen könnte müssen.

0

Erweitern Andreas Antwort. Diese Zeichen sind Buchstaben + Kombinationsdimerese (U-0308). Ich war in der Lage, sie nach Standard-Umlauten zu suchen und zu ersetzen, und dann durch alles zu ersetzen, was benötigt wird. Dies ist die Funktion, die ich verwendet habe, um sie zu ersetzen:

function convertToUmlauts($str) { 
    $srp_array = ['Ö' => 'Ö', 'Ä' => 'Ä', 'Ü' => 'Ü', '̈a' => 'ä', 'ö' => 'ö', 'ü' => 'ü']; 
    return strtr($str, $srp_array); 
} 
2

Dies sind zwei verschiedene Formen, um den gleichen Buchstaben in Unicode auszudrücken; eines ist die Kombination eines O mit einer Kombination von Dieresen, das andere ist der Buchstabe Ö. Unicode allows either variant to express "Ö".

Um normalisieren, die in Ihre bevorzugten Variante verwenden Normalizer::normalize:

$str = Normalizer::normalize('Ö', Normalizer::FORM_C); 

wahrscheinlich, dass Sie Form C wollen, die auf "Ö" (die einzelnen Buchstaben Form) konvergieren. Wenn Sie lieber "O" + zusammen verwenden möchten, verwenden Sie stattdessen Form D.