鉴于此测试脚本:
<?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 .
使用/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 模式进行匹配,并且它应适用于所有系统。