我正在zend框架中构建一个需要UTF8支持所有语言的Web应用程序。 这似乎工作正常,除了像stripslashes等函数。
在此网址上,他们讨论了如何使用MBSTRING http://developer.loftdigital.com/blog/php-utf-8-cheatsheet
是否有必要在我的服务器上使用mbstring并用MB-variant替换所有出现无UTF8功能的函数?
Zend Framework不支持UTF8吗? 如果没有,我们必须将ZF-codebase中的所有函数替换为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的现有应用程序,还是“优雅地降级”?
答案 0 :(得分: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数组的post&来自数据库的评论
如果不使用mb字符串,我无法完成工作 因为php本身不处理utf8 :(
我喜欢它让我的生活更轻松
编辑: 我想说的是在需要的时候使用mbstring,让框架管理自己,我不喜欢自动重载所有函数。
答案 1 :(得分:3)
不要,我只能重复,不要使用mbstring重载。它肯定会破坏任何方法,例如,依赖于strlen()返回字节数。 Zend Framework中的所有组件都默认使用UTF-8,但如果你告诉它,它可以处理不同的字符集。这是通过iconv_ *来完成的,默认情况下它是内置在PHP中的,所以没有像mbstring这样的额外库的依赖。
唯一的问题是你必须告诉Zend Framework关于UTF-8是你的数据库连接,你可以通过charset选项简单地完成(参见Zend_Db或Zend_Application文档)。您当然还想通过内容类型标题告诉用户代理您提供的字符集。不要忘记在标签中添加accept-charset =“utf-8”。
答案 2 :(得分:1)
Zend Framework不支持 支持UTF8?
我不知道。例如,只需查看代码搜索strlen,但您仍需要查看代码以确定它是否在非多字节安全的上下文中使用。快速谷歌搜索显示了这个http://www.iezzi.ch/archives/371所以似乎ZF已经为UTF8应用做好了准备。
对此我有什么建议,我可能会这样 完全错了吗?我读到了 使用:mbstring.func_overload = 7; 这会破坏现有的吗? 不需要UTF8或的应用程序 它会“优雅地降级”吗?
当然它也适用于非多字节字符串而不会破坏它。但在使用它之前,我建议确保你真的需要它,因为它会降低性能。