我正在尝试使用 preg_replace 来消除日语全角空格“
“来自字符串输入,但最终得到一个损坏的多字节字符串。
我更喜欢 preg_replace 而不是 str_replace。
这是示例代码:
$keywords = ' ラメ単色';
$keywords = str_replace(array(' ', ' '), ' ', urldecode($keywords)); // outputs :'ラメ単色'
$keywords = preg_replace("@[ ]@", ' ',urldecode($keywords)); // outputs :'�� ��単色'
任何人都知道为什么会这样以及如何纠正这种情况?
Add the u
标记到您的正则表达式。这使得 RegEx 引擎将输入字符串视为 UTF-8。
$keywords = preg_replace("@[ ]@u", ' ',urldecode($keywords));
// outputs :'ラメ単色'
CodePad http://codepad.viper-7.com/0kmBb4.
它破坏字符串的原因是因为对于正则表达式引擎来说,您的替换字符,20
(空格)或e3 80 80
(IDEOGRAPHIC SPACE)不被视为两个字符,而是单独的字节20
, e3
and 80
.
当您查看要扫描的字符串的字节序列时,我们得到e3 80 80 e3 83 a9 e3 83 a1 e5 8d 98 e8 89 b2
。我们知道第一个字符是表意空间,但由于 PHP 将其视为字节序列,因此它会单独替换前四个字节,因为它们与正则表达式引擎正在扫描的各个字节相匹配。
至于导致 �(替换字符)的损坏,我们可以看到发生这种情况是因为字节e3
存在于字符串中更远的位置。这e3
byte 是三字节长的日语字符的起始字节,例如e3 83 a9
(片假名字母 RA)。当那领先e3
被替换为20
(空格),它不再成为有效的 UTF-8 序列。
当您启用u
标志,RegEx 引擎将字符串视为 UTF-8,并且不会按字节处理字符类中的字符。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)