【问题标题】:Replace unicode formatted special characters替换 unicode 格式的特殊字符
【发布时间】:2014-03-31 07:55:36
【问题描述】:

我需要用其他字符替换字符串中的特殊字符。例如,“ä”可以用“a”或“ae”替换,“à”也可以用“a”替换。通常使用 PHP 很容易做到这一点,并且 stackoverflow 上有很多函数,它们已经完全做到了。

不幸的是,我的字符串如下所示:“u\u0308 a\u0302 a\u0308 o\u0300.zip”(ü â ä ò.zip)。您可能会看到我的字符串是文件名,而 OSX 似乎将字符转换为 unicode(至少我是这么认为的)。

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

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

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

【问题讨论】:

  • mb_convert_encoding()iconv()//TRANSLIT
  • utf8_encode($data) 也可能有效。
  • @PimVerlangen utf8_encode 输出相同的字符串,所以 "u\u0308 a\u0302 a\u0308 o\u0300.zip"
  • @MarkBaker 我必须使用什么作为字符集/编码类型?
  • 它可能是什么字符集?我只能猜测! “ISO-8859-1”也许

标签: php regex unicode


【解决方案1】:

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

  • 将 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

【讨论】:

  • 非常感谢,还没想到实体!不确定代码的哪一部分导致了这种情况,但如果 unicode 字符之间没有空格,代码将输出“?”。所以“a\u0308a\u0308”(ää)输出“a?”。我尝试将 {4} 添加到正则表达式“'/\\\\u([0-9a-f]+){4}/i'”,但似乎无法解决问题。
  • @demrks:它应该输出什么? aa?
  • 是的,在这种情况下是 'aa'。如果字符串是“o\u0308u\u0308”(öü)类似于“ou”。
  • 奇怪,"öü" 确实有效,但 "ää" (-> "aa") 无效,请参阅 eval.in/129478
  • 知道了,这个正则表达式对我有用:preg_replace("/\\\\u([0-9a-fA-F]{4})/", "&#x\\1;", $string)
猜你喜欢
  • 2021-04-14
  • 2021-12-23
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
  • 1970-01-01
相关资源
最近更新 更多