替换unicode格式化的特殊字符

时间:2014-03-31 07:55:36

标签: php regex unicode

我需要用其他字符替换字符串中的特殊字符。例如,“ä”可以用“a”或“ae”代替,“à”也可以用“a”代替。通常情况下,使用PHP非常容易,而且stackoverflow上有很多函数,这些函数已经完全正确。

不幸的是,我的字符串看起来像这样:“你好了\ u0308 \ u0308 o \ u0300.zip”(üâ€ò.zip)。正如您可能看到我的字符串是文件名,OSX似乎将字符转换为unicode(至少这是我的想法)。

我知道我可以使用一个包含所有特殊字符的非常长的数组来替换它们:

$str = "u\u0308 a\u0302 a\u0308 o\u0300.zip";

$ch = array("u\u0308", "a\u0302", "a\u0308", "o\u0300");
$chReplace = = array("u", "a", "a", "o");

str_replace($ch, $chReplace, $str);

但我想知道是否有更简单的方法,所以我不必为每个角色手动执行此操作?

1 个答案:

答案 0 :(得分:2)

您可以通过将其分为多个步骤来解决此问题:

  • 将Unicode代码点转换为实际实体。使用preg_replace()可以轻松实现这一点。有关正则表达式如何工作的说明,请参阅my answer here

  • 现在您将拥有一组像ü这样的字符。这些是HTML实体。要将它们转换为相应的字符表单,请使用html_entity_decode()

  • 您现在将拥有一个UTF-8字符串。您需要将其转换为ISO-8859-1(官方ISO 8位Latin-1)。 //TRANSLIT部分是为了实现过渡。如果启用此选项,则当无法在目标字符集中表示某个字符时,它将尝试近似结果。

代码:

// Set the locale to something that's UTF-8 capable
setlocale(LC_ALL, 'en_US.UTF-8');

$str = "u\u0308 a\u0302 a\u0308 o\u0300";

// Convert the codepoints to entities
$str = preg_replace("/\\\\u([0-9a-fA-F]{4})/", "&#x\\1;", $str);

// Convert the entities to a UTF-8 string
$str = html_entity_decode($str, ENT_QUOTES, 'UTF-8');

// Convert the UTF-8 string to an ISO-8859-1 string
echo iconv("UTF-8", "ISO-8859-1//TRANSLIT", $str);

输出:

u a a o

Demo