我有这两个字符串:
$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格式BNOE
或BNO
?
我知道也许我可以从两者中复制Ö并包含在strtr
搜索和替换数组中但我不知道如何重现所有编码的字符与第一个Ös相同。
答案 0 :(得分:5)
这两种不同形式用Unicode表示相同的字母;一个是O与组合diereses的组合,另一个是字母Ö。 Unicode allows either variant to express "Ö".
要 规范化 进入首选版本,请使用Normalizer::normalize
:
$str = Normalizer::normalize('Ö', Normalizer::FORM_C);
可能你想要Form C,它将汇聚于“Ö”(单字母形式)。如果您更喜欢“O”+组合饮食,请使用表格D.
答案 1 :(得分:0)
您可以先使用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
的编码列表中添加其他编码。
答案 2 :(得分:0)
扩展Andreas的答案。这些字符是字母+组合分音符(U-0308)。我能够搜索并将它们替换为标准变音符号,然后替换为所需的任何内容。这是我用来取代它们的功能:
{{1}}