PHP字符串函数与mbstring函数


PHP string functions vs mbstring functions

我有一个迄今为止只有英文版的应用程序。整个模板和数据库的内容编码都是UTF-8。我现在希望将应用程序国际化/翻译成具有绝对需要UTF-8的字符集的语言。

该应用程序使用各种PHP字符串函数,如strlen()strpos()substr()等,我的理解是,我应该将这些函数切换为多字节字符串函数,例如mb_strlen()mb_strlen()mb_substr()等,以便正确处理多字节字符。我试着围绕这个主题读了一点,但实际上我能找到的所有东西都深入到了"编码理论"中,并没有为这个问题提供一个简单的答案:如果我一直使用UTF-8,我可以从使用strlen()切换到mb_strlen(),并期望它能正常工作,例如英语和阿拉伯语,还是我还需要注意其他东西?

任何见解都是受欢迎的,如果我冒犯了一个用我相对无知来编码他们内心深处的人,我深表歉意。

否。由于字节数组在PHP中也是字符串,用它们的mb_*对应函数简单地替换8位字符串函数只会带来麻烦。像strlen()和substr()这样的函数可能比实际的文本字符串更频繁地与字节一起使用。

在我上一次工作的地方,我们设法用PHP建立了一个多语言网站(阿拉伯语、印地语和其他语言),而根本不使用mbstring库。文本字符串操作实际上并不经常发生。当它这样做时,它将需要比仅仅更改函数名更为小心的操作。我发现,大多数挑战都在HTML方面。让页面布局与RTL语言一起工作是非常重要的部分。

我不知道你是否只是以阿拉伯语为例。国际化的难度可能会有很大差异,这取决于"国际"是否仅指欧洲语言(加上俄语),或者是否包括中东、南亚和远东语言。

检查php.ini 中mbstring.func_overload标志的状态

如果(ini_get('bstring.func_overload')&2) 那么像strlen()这样的函数(如这里所列)已经被mbstrlen函数重载了,所以不需要显式调用mb*函数。

真正需要的多字节函数数量不到10个,所以无论函数或逻辑的使用情况如何,都要创建3到5个问题。这个问题很难回答。小问题可以快速得到答案。具体的问题可以给出好的答案。当你提出其他问题时,请告诉我。

如果您需要用例,请参阅CMS中的回退函数,如Wordpress、MediaWiki、Drupal。

当您决定开始使用mbstring时,应避免使用mbstring.func_overload指令。Mbstring维护人员将在PHP 5.5或5.6中弃用Mbstring.func_overload(请参阅2012年4月的PHP核心邮件列表)。mbstring.func_overload破坏了不希望使用mbstring.func_overload的代码库。您可以在CakePHP、Zend Framework 1x中使用strlen()计算内容长度中看到这种情况。

我在另一个地方回答了类似的问题:我应该重构所有的框架来使用mbstring函数吗?