【问题标题】:PHP: Multibyte unicode convertionPHP:多字节unicode转换
【发布时间】:2014-04-22 13:48:50
【问题描述】:

我已经在谷歌上搜索了一下,也在这里搜索,但可以找到解决方案。我正在使用 PHP。我正在读取一个文本字符串(X509 证书的一部分)并将 é 编码为 \xC3\xA9 (André => Andr\xC3\xA9)。

我试过MonkeyPhysics's解决方案:

preg_replace("#(\\\x[0-9A-F]{2})#ei", "chr(hexdec('\\1'))", $string);

但后来我得到 André

我玩过 replacement 部分;

mb_convert_encoding('&#' . hexdec('\\1') . ';', 'ISO-8859-1', 'UTF-8')

(还有 to_encoding 和 from_encoding)

我也看过How to transliterate non-latin scripts?,但没有更进一步。

这应该是标准转换吧?

【问题讨论】:

  • 首先不推荐使用 e 修饰符,使用 preg_replace_callback 代替(参见 PHP 手册,很容易转换)。在使用mb_convert_encoding之前,请尝试将<meta charset="UTF-8"/>放在显示代码结果的html页面的header中。

标签: php regex unicode


【解决方案1】:

现在 PHP 不推荐使用 e 修饰符。您需要使用 preg_replace_callback 而不是 /u 修饰符来处理 unicode 字符串。

$string = 'His nickname was \xE2\x80\x98the Angel\xE2\x80\x99,
which is kind of a clich\xC3\xA9 in my opinion.';

$repl = preg_replace_callback("#(\\\x[0-9A-F]{2})#ui",
           function ($m) { return chr(hexdec($m[1])); }, $string);

输出:

His nickname was ‘the Angel’,
which is kind of a cliché in my opinion.

【讨论】:

  • 感谢您的成功,html 页面设置为 UTF-8 并且使用此 preg_replace_callback 有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 2015-07-20
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 2019-08-15
相关资源
最近更新 更多