鉴于此测试脚本:
<?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个字节视为没有u
修饰符的UTF-8。
答案 0 :(得分:1)
使用/u
modifier:
u(PCRE_UTF8)此修饰符打开PCRE的其他功能 这与Perl不兼容。模式字符串被视为UTF-8。
默认情况下,该字符串被视为一个单字节字符序列;问题是你的一些字符在UTF-8中被编码为多字节。虽然0xc3a0
是单个代码点,但\s
将匹配其第二个字节0xa0
,这是一个不间断的空格,因此是空格。
$var = preg_replace('/\s+$/u', '', $in);
应该启用UTF-8模式进行匹配,它应该适用于所有系统。