【发布时间】:2014-06-08 09:25:48
【问题描述】:
鉴于此测试脚本:
<?php
echo setlocale(LC_ALL, '') . "\n";
$in = 'Città';
$var = preg_replace('/\s+$/', '', $in);
echo bin2hex($in) . "\n";
echo bin2hex($var) . "\n";
Ubuntu 上的 PHP 5.5.3,我得到:
en_GB.UTF-8
43697474c3a0
43697474c3a0
Mac 上的 PHP 5.5.9(通过 Macports)
en_GB.UTF-8
43697474c3a0
43697474c3
Macports 版本是否有任何理由以不同方式对待 à 字符?
我知道 c3a0 在 ASCII 中被视为两个字节时,是 Ã 后跟一个不间断空格。我想知道为什么一个系统将 2 个字节视为 UTF-8 而没有 u 修饰符。
【问题讨论】:
-
如果您使用
/u修饰符,问题是否仍然存在? php.net/manual/en/reference.pcre.pattern.modifiers.php 模式将是/\s+$/u -
@TimJones 使用
u修饰符,php/regex 引擎会将输入视为 UTF-8 字符串。因此,使用u修饰符它将“识别”0xc3a0是à,而没有u修饰符它将“识别”它们为单独的字符0xc3和0xa0。0xa0是 some kind of space,这就是它删除它的原因,因为\s匹配一个空格。 -
@HamZa 是的,这也是我的理解。我很困惑为什么 Ubuntu 系统使用 u 修饰符将
0xc3a0视为一个 unicode 字符而不使用。有什么想法吗? -
请检查链接的 libpcre PHP 版本以及使用的配置。我总是建议使用捆绑版本来避免此类问题。可能 PCRE 是用不同的语言环境编译的。
-
您可以通过简单的测试知道差异是否来自语言环境(用于编译 pcre 模块)。尝试将
à与\w匹配。