将两个看起来相似的不同类型的德语字符转换为PHP中的相同ASCII字符串

时间:2016-05-04 08:09:12

标签: php encoding utf-8 ascii

我有这两个字符串:

$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

我知道也许我可以从两者中复制Ö并包含在strtr搜索和替换数组中但我不知道如何重现所有编码的字符与第一个Ös相同。

3 个答案:

答案 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}}