2个PHP系统上的不同正则表达式输出?

Tim*_*nes 5 php regex unicode

鉴于此测试脚本:

<?php

echo setlocale(LC_ALL, '') . "\n";

$in = 'Città';

$var = preg_replace('/\s+$/', '', $in);

echo bin2hex($in) . "\n";
echo bin2hex($var) . "\n";
Run Code Online (Sandbox Code Playgroud)

关于Ubuntu的PHP 5.5.3,我得到:

en_GB.UTF-8
43697474c3a0
43697474c3a0
Run Code Online (Sandbox Code Playgroud)

Mac上的PHP 5.5.9(通过Macports)

en_GB.UTF-8
43697474c3a0
43697474c3
Run Code Online (Sandbox Code Playgroud)

有没有什么理由为什么Macports构建将以à不同的方式对待角色?

我知道c3a0,当被视为ASCII中的两个字节时,Ã后面跟着一个不间断的空格.我想知道为什么一个系统将2个字节视为没有u修饰符的UTF-8 .

Pis*_*3.0 1

使用/u 修饰符

u (PCRE_UTF8) 此修饰符打开与 Perl 不兼容的 PCRE 附加功能。模式字符串被视为 UTF-8。

默认情况下,字符串被视为单字节字符序列;问题是您的某些字符被编码为 UTF-8 中的多字节。虽然0xc3a0是单个代码点,\s但将匹配其第二个字节 ,0xa0这是一个不间断的空格,因此也是空格。

$var = preg_replace('/\s+$/u', '', $in);
Run Code Online (Sandbox Code Playgroud)

应启用 UTF-8 模式进行匹配,并且它应适用于所有系统。

  • “U+00A0”是一个不间断空格,而不是换行符(即“U+000A”),但无论如何它都是一个空白字符。+1 (2认同)