在EUC-JP环境中使用php str_replace替换双字节空间时,会发生错误


介绍

如标题所示,本文是在以下情况下发生的现象的提示。
-在字符代码为EUC-JP 的环境中
-使用php的str_replace函数
-替换双字节空格时
-它甚至替换了意外的单词

发生的现象

我从数据库中的值奇怪的angular开始。
似乎保留了" Ah"而不是" Ze"。
克里斯托弗是克里斯托弗。
当我遵循该程序时,似乎在将值输入到DB之前的处理很奇怪。

1
$trimmed_str = str_replace(" ", "", $str);

总之,这是一种现象,"替换双字节空间会影响字符串'ah'"。

原因

原因是

环境的字符代码是EUC-JP。
EUC-JP是一个多字节字符,双字节字符由多个十六进制数字的组合表示。
参考:https://qiita.com/mpyw/items/a8dba1b80fe68523b8eb

映射如下表中的URL所示。
http://charset.7jp.net/euc.html
当应用于表时," a"为" 0501","-"为" 01bc"。
而全角空格为'0101'...
简而言之,我从" 050101bc"中排除了" 0101",并将其转换为" 05bc",即" ze"。

对策

为了摆脱这种情况,可以采取以下措施来解决。

突破EUC-JP

可以通过将

环境的字符代码从EUC-JP更改为UTF-8来解决。
在UTF-8中,该区域除以第一个字节和随后的字节,因此不会与这种现象中的其他字符组合混淆。
详细信息在原因部分中介绍的文章中进行了描述,因此请参考该内容。

修改为支持多字节字符的功能

但是,在某些情况下无法轻松修改字符代码。
(某些人可能必须修改旧环境。)
在这种情况下,解决方案是移至支持多字节的功能。

1
$trimmed_str = mb_ereg_replace(" ", "", $str);

mb_ereg_replace具有多字节功能,因此请不要将字符组合与这些字符混淆。
https://www.php.net/manual/ja/function.mb-ereg-replace.php

如果解释有误,请提出宝贵意见。