PHP字符串函数与mbstring函数

时间:2012-08-20 22:10:53

标签: php encoding utf-8 mbstring

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

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

任何见解都会受到欢迎,并且如果我因为相对的无知而冒犯了一个接近他们内心编码的人,我会道歉。

3 个答案:

答案 0 :(得分:3)

没有。由于bytearrays也是PHP中的字符串,因此用它们的mb_ *副本简单替换8位字符串函数只会造成麻烦。像strlen()和substr()这样的函数可能更常用于字节而不是实际的文本字符串。

在我上次工作的地方,我们设法在PHP中构建了一个多语言网站(阿拉伯语,印地语,以及其他语言),而根本不使用mbstring库。文本字符串操作实际上并不经常发生。当它发生时,它需要的不仅仅是更改函数名称。我发现,大多数挑战都存在于HTML方面。获取页面布局以使用RTL语言是非常重要的部分。

我不知道你是否只是用阿拉伯语作为例子。国际化的难度可能有很大差异,取决于“国际”是指仅欧洲语言(加俄语),还是包含中东,南亚和远东语言。

答案 1 :(得分:1)

检查php.ini中的mbstring.func_overload flag

的状态

如果(ini_get('mbstring.func_overload')& 2)那么像strlen()(如列出的here)这样的函数已经被mb_strlen()函数重载了,所以你不需要明确调用mb_ *函数。

答案 2 :(得分:1)

真正需要的多字节函数的数量小于10,因此无论函数或逻辑的使用是否良好,都要创建3或5个问题。这个问题是安全的,很难回答。小问题可以得到快速答案。具体问题可以带来很好的答案。当你提出其他问题时,请告诉我。

如果您需要用例,请参阅CMSes中的后备功能,例如WordpressMediaWikiDrupal

当您决定开始使用mbstring时,应该避免使用mbstring.func_overload指令。 Mbstring维护者将在PHP 5.5或5.6中弃用mbstring.func_overload(参见2012年4月的P HP core mailing list)。 mbstring.func_overload打破了不希望使用mbstring.func_overload的代码库。您可以使用 strlen()在CakePHP,Zend Framework 1x中查看 Content-Length 的案例。

我在另一个地方回答了类似的问题:Should i refactor all my framework to use mbstring functions?