1

我正在 zend 框架中构建一个 web 应用程序,它需要对所有语言的 UTF8 支持。除了像stripslashes之类的功能外,这似乎工作正常。

在这个 URL 上,他们谈论使用 MBSTRING http://developer.loftdigital.com/blog/php-utf-8-cheatsheet

是否有必要在我的服务器上使用 mbstring 并用它们的 MB 变体替换所有不支持 UTF8 的函数的出现?

Zend Framework 不支持 UTF8 吗?如果不是,我们必须将 ZF 代码库中的所有函数替换为它们的 mb_ 替代项,对吗?这是一项不可能完成的任务,因为升级到新的 ZF 会破坏我们的代码。

mail()      -> mb_send_mail()
strlen()    -> mb_strlen()  
strpos()    -> mb_strpos()
strrpos()   -> mb_strrpos()
substr()    -> mb_substr()
strtolower()    -> mb_strtolower()
strtoupper()    -> mb_strtoupper()
substr_count()  -> mb_substr_count()
ereg()      -> mb_ereg()
eregi()     -> mb_eregi()
ereg_replace()  -> mb_ereg_replace()
eregi_replace() -> mb_eregi_replace()   
split()     -> mb_split()

你对此有什么建议,我可能完全错了?我读到了关于使用:

mbstring.func_overload  = 7 ;

自动重载所有功能。

这会破坏不需要 UTF8 的现有应用程序还是“优雅地降级”?

4

3 回答 3

3

我不认为用 mb_string 重载所有函数会很好,我们都知道 PHP 本身不能处理 utf8,所以我们使用类似的东西

数据库的“SET NAMES utf8” & 我们使用 Zendmail + 将编码作为参数传递给它,让 Zend 邮件在内部自行管理

另一个例子是Zend_Validate_StringLength它有一个调用的参数encoding,它 iconv在函数中使用:

 public function setEncoding($encoding = null)
    {
        if ($encoding !== null) {
            $orig   = iconv_get_encoding('internal_encoding');
            $result = iconv_set_encoding('internal_encoding', $encoding);
            if (!$result) {
                require_once 'Zend/Validate/Exception.php';
                throw new Zend_Validate_Exception('Given encoding not supported on this OS!');
            }

            iconv_set_encoding('internal_encoding', $orig);
        }

        $this->_encoding = $encoding;
        return $this;
    }

但是你总是会在你的应用程序中使用一些与框架无关的逻辑中的 mb_string 。

例如,昨天我正在对数据库中的帖子和评论的 utf8 数组进行排序

如果不使用 mb 字符串,我无法完成工作,因为 php 本身不能处理 utf8 :(

我爱 mb string 它让我的生活更轻松

编辑:我的意思是在需要时使用 mbstring,并让框架自行管理,我不喜欢自动重载所有函数。

于 2010-08-20T14:45:17.660 回答
3

不要,我只能重复,不要使用mbstring重载。它肯定会破坏任何方法,例如,依赖于 strlen() 返回字节数的方法。Zend Framework 中的所有组件都默认使用 UTF-8,但如果您告诉它可以处理不同的字符集。这是通过默认内置在 PHP 中的 iconv_* 完成的,因此不依赖于像 mbstring 这样的额外库。

唯一需要告诉 Zend Framework 关于 UTF-8 的是数据库连接,您可以通过 charset 选项简单地完成(参见 Zend_Db 或 Zend_Application 文档)。您当然还想通过内容类型标头告诉用户代理您提供的字符集。并且不要忘记在您的标签中添加 accept-charset="utf-8" 。

于 2010-08-22T01:45:39.373 回答
1

Zend Framework 不支持 UTF8 吗?

我不知道。例如,只需通过 grep 搜索 strlen 的代码,但您仍然需要查看代码以确定它是否在非多字节安全的上下文中使用。快速谷歌搜索显示了这个http://www.iezzi.ch/archives/371,所以 ZF 似乎为 UTF8 应用程序做好了准备。

你对此有什么建议,我可能完全错了?我读过关于使用: mbstring.func_overload = 7 ;这会破坏不需要 UTF8 的现有应用程序还是“优雅地降级”?

当然,它也适用于非多字节字符串并且不会破坏它。但在使用它之前,我建议确保您确实需要它,因为它会降低性能。

于 2010-08-20T14:24:23.997 回答