为什么在PHP中使用多字节字符串函数?

rab*_*dde 9 php utf-8 multibyte

目前,我不明白为什么在处理UTF-8时在PHP中使用mbstring函数非常重要?我在linux下的语言环境已经设置为UTF-8,那么为什么函数不能strlen,preg_replace等等默认情况下无法正常工作?

Fra*_*nes 13

无论您的操作系统的语言环境如何,所有PHP 字符串函数都不会处理多字节字符串.这就是您需要使用多字节字符串函数的原因.

多字节字符串简介:

当您操作(修剪,拆分,拼接等)以多字节编码编码的字符串时,您需要使用特殊函数,因为在此类编码方案中,两个或多个连续字节可能表示单个字符.否则,如果您对字符串应用非多字节感知字符串函数,它可能无法检测到多字节字符的开头或结尾,并最终导致损坏的垃圾字符串很可能失去其原始含义.

  • @rabudde-您可以在[这里](http://www.php.net/manual/en/mbstring.overload.php)获得具有多字节等效项的函数列表。至于`str_replace`,它确实适用于UTF-8字符串。参见[this](http://stackoverflow.com/questions/2652193/can-str-replace-be-safely-used-on-a-utf-8-encoded-string-if-its-only-given-valid )。 (2认同)
  • 那么你会说在我自己的应用程序中用等效的 mbstring 函数替换 **all** php 函数是个好主意吗?会不会有一些负面影响(无论性能如何)? (2认同)

小智 6

这里的人不懂UTF-8.

您不需要使用UTF-8感知代码来处理UTF-8.在大多数情况下.

我甚至只使用字节感知功能编写了Unicode大写/小写,NFC和NFD变换.很难想到比这更复杂的东西,需要对UTF-8进行如此细致和细致的处理.但它仍然适用于仅字节函数.

您需要UTF-8感知代码是非常罕见的.也许计算字符数,或将插入点向前移动1个字符.但实际上,即使这样你的代码也无法工作;)因为分解了字符.

但是,如果您所做的只是替换,查找内容,甚至解析语法,您只需要字节感知功能.

我会解释原因.

这是因为在任何其他UTF-8字符中都找不到UTF-8字符.这就是它的设计方式.

尝试向我解释如何在多字节系统中获取文本处理错误,在多字节系统中,在另一个字符中找不到字符?只是一个例子!你能想到的最简单.


Kum*_*mar 5

这是我用简单的英语回答。单个日文、中文和韩文字符占用多个字节。例如,一个典型的字符说x是在英语中需要 1 个字节,而1在日语、中文和韩语中则需要多于一个字节。现在 PHP 的标准字符串函数旨在将单个字符视为 1 个字节。因此,如果您尝试比较两个日语或中文或韩语字符,它们将无法按预期工作。例如“Hello World!”的长度 在日语或中文或韩语中将有超过 12 个字节。

阅读http://www.php.net/manual/en/intro.mbstring.php