2016-05-04 17 views
1

我有这两个字符串:转换2同样的前瞻性不同种类相同的ASCII字符串的德语字符在PHP

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

结果是:

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

看来,他们不仅德国的字符也是他们每个人不同的,所以将它们转换为ASCII这样

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

不会产生相同的结果。有没有办法将这两个字符串转换为这些ASCII形式之一BNOEBNO


我知道,也许我可以从两个复制o和包括strtr搜索和替换数组,但我不知道如何重现所有本地字符编码相同的方式,第一OS是。

回答

1

您可以先使用iconv将输入转换为utf-8,然后将转换应用到ASCII。要检测当前编码,您可以使用mb_detect_encoding

$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); 

请注意,您可能需要额外的编码增加的mb_detect_encoding编码列表。

0

扩展Andreas的答案。这些字符是字母+结合分音(U-0308)。我能够搜索并替换它们到标准变音器,然后用任何需要的替换。这是我用来代替它们的功能:

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

这些是用Unicode表示相同字母的两种不同形式;一个是O与组合diereses的组合,另一个是字母Ö。 Unicode allows either variant to express "Ö".

正常化即至您喜欢的变例,使用Normalizer::normalize

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

可能是你想要C型,这将汇聚在 “O”(单字母形式)。如果你更喜欢“O”+结合diereses,使用形式D代替。

相关问题