是否需要 mb_* 来替换多字节字符串中的单字节字符?
假设我有一个如下所示的 UTF-8
文本:
âàêíóôõ <br> âàêíóôõ <br> âàêíóôõ
我想将
替换为
。我需要使用 mb_str_replace
还是可以使用 str_replace
?
考虑<
b
r
/
>
都是单字节char吗?
Let's say I have an UTF-8
text like this:
âàêíóôõ <br> âàêíóôõ <br> âàêíóôõ
I want to replace <br>
with <br />
. Do I need to use mb_str_replace
or I can use str_replace
?
Consindering <
b
r
/
>
are all single byte char?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
由于
str_replace
是二进制安全的并且 UTF-8 是双射编码,因此您可以使用str_replace
,即使搜索字符串或替换包含多字节字符,只要所有三个参数都编码为UTF-8即可。这就是为什么首先没有
mb_str_replace
函数的原因。如果您的编码不是双射的 - 即同一字符串有多种表示形式,例如 UTF-7 中的
<
,可以表示为'+ADw-'
和'<'
,您应该将所有字符串转换为相同(双射)编码,应用str_replace
,然后将字符串转换为目标编码。Since
str_replace
is binary-safe and UTF-8 is a bijective encoding, you can usestr_replace
, even if search string or replacement contains multi-byte characters, as long as all three parameters are encoded as UTF-8.That's why there isn't an
mb_str_replace
function in the first place.If your encoding is not bijective - i.e. there are multiple representations of the same string, for example
<
in UTF-7, which can be expressed both as'+ADw-'
and'<'
, you should convert all strings to the same (bijective) encoding, applystr_replace
, and then convert the strings to the target encoding.在 PHP 中安全操作 UTF-8 字符串的参考 (存档)。没有硬性规定。一些本机 PHP 字符串函数可以在 utf-8 上安全运行,有些可以小心,有些则不能。
没有
mb_str_replace()
。请注意“UTF-8 安全功能”部分:只要所有三个参数都是有效的 UTF-8 字符串,explode()
和str_replace()
就是安全的。Reference for manipulating UTF-8 strings safely in PHP (archive). There is no hard-and-fast rule. Some native PHP string functions functions can operate safely on utf-8, some can with care, and some cannot.
There is no
mb_str_replace()
. Notice the section "UTF-8 Safe Functionality":explode()
andstr_replace()
are safe as long as all three arguments to it are valid UTF-8 strings.