用 preg_replace 替换空 space 会导致 UTF-8 无效字符

Replacing empty space with preg_replace causes invalid characters with UTF-8

我们的 PHP 网络应用程序(Windows Server 2008 R2 上的 PHP 5.6.30 运行)使用 UTF-8 编码,但需要从使用 Windows-1252。导入数据时,它会转换为 UTF-8,如下所示。

iconv('Windows-1252', 'UTF-8', $value);

当我们导入以下示例数据时,大多数 Windows-1252 字符的转换工作正常,但在下面的第 8 行中,à 字符出现问题并且未正确转换。

1;€
2;é
3;è
4;ë
5;ï
6;ä
7;á
8;à
9;ç
10;ß
11;ø 
12;í
13;ì
14;ñ
15;@
16;û

这里是显示在网站上显示此数据的结果的屏幕截图。

有谁知道为什么 PHP iconv 没有正确转换 à 字符?

我解决了这个问题,但它最终与我最初认为的 iconv 无关。所需的更改是如此之小,只有一个字符,但我花了很长时间才找到它。事实证明,违规声明实际上如下:

preg_replace('/\s+/', ' ',$columnvalue))

此正则表达式的目的是从值中删除白色 space,但由于编码是 UTF-8,此 regular expression 具有破坏 [=15] 的残留效果=] 字符。我解决了这个问题,但将 u (unicode modifier) 添加到正则表达式定义的末尾。所以表达式变成了:

preg_replace('/\s+/u', ' ',$columnvalue))

然后页面的编码是正确的。