在OpenCart中,Daniel包含一个带有各种UTF8函数的UTF8帮助文件。
这是我的问题......
在本机php函数中包含utf8解码的代码段与在OpenCart中使用utf8辅助函数相比,产生的差异(我找不到)是什么?
例如,在OpenCart验证领域,我们看到了很多这样的内容:
if (utf8_strlen($this->request->post['myvalue']) < 3)
与...完全相同:
if (strlen(utf8_decode($this->request->post['myvalue'])) < 3)
utf8_strtolower
,utf8_strpos
等文件中还有其他辅助函数。
为什么不简单地使用:
strtolower (utf8_decode($myvariable))
好奇,因为我正在构建一个基于OpenCart MVC的新CMS框架。
编辑:添加新的mb_
课程。
以下是mb_
函数的新类,请检查是否有任何错误。
final class Tester {
public function _strlen ($string) {
return mb_strlen ($string, mb_detect_encoding($string));
}
public function _strpos ($string, $needle, $offset = false) {
if (!$offset):
$data = explode ($needle, $string, 2);
if (count ($data) > 1):
$offset = $this->_strlen ($data[0]);
endif;
endif;
return mb_strpos ($string, $needle, $offset, mb_detect_encoding ($string));
}
public function _strrpos ($string, $needle, $offset = false) {
if (!$offset):
$data = explode ($needle, $string);
if (count ($data) > 1):
array_pop ($data);
$string = join ($needle, $data);
$offset = $this->_strlen ($string);
endif;
endif;
return mb_strrpos ($string, $needle, $offset, mb_detect_encoding ($string));
}
public function _substr ($string, $start, $length = false) {
if (!$length):
$length = $this->_strlen ($string);
endif;
return mb_substr ($string, $start, $length, mb_detect_encoding ($string));
}
public function _strtolower ($string) {
return mb_strtolower ($string, mb_detect_encoding ($string));
}
public function _strtoupper ($string) {
return mb_strtoupper ($string, mb_detect_encoding ($string));
}
public function _array ($data, $exit = true) {
echo "<pre>";
print_r ($data);
echo "</pre>";
if ($exit):
exit;
endif;
}
}
这还包括我之前在加载器类中使用的数组测试功能。
答案 0 :(得分:2)
正如Hugo所指出的,这些辅助函数只是调用两三个不同函数的包装器。有时,这些函数看起来就像strpos
编码文本的整个UTF-8
重新实现 ...
说实话,我不喜欢那些utf8_strtolower
/ utf8_strtoupper
实现,也不喜欢帮助器中的其他utf8_*
函数(我想我会呕吐)。每当我实现自己的模块或其他修改时,我都使用mbstring
函数:
mb_strtolower($string, 'UTF-8');
mb_strlen($string, 'UTF-8');
它们与基本字符串函数相同,但需要使用其他(可选)编码参数。有许多多字节操作,请检查documentation。这些可以用于任何编码甚至你不知道编码,你可以这样使用它们:
// here the encoding is get by calling mb_internal_encoding() function,
//which may not be the same as the string encoding
mb_strtolower($string);
// and here we let PHP to detect the real encoding of the string
mb_strtolower($string, mb_detect_encoding($string));
// but if we are sure it is in e.g., UTF-8
mb_strtolower($string, 'UTF-8');
这些功能的唯一要求是启用PHP mbstring
扩展名。
编辑:所以你也在使用新的方法,因此也打破了一致性:-)除非这个新类将参与新版本的OC(并替换帮助类) 。 : - )
无论如何,创建仅使用YouNameIt
函数的类mbstring
(我想不出名称......)会好得多,如下所示:
class YouNameIt {
public function strlen($string) {
return mb_strlen($string, mb_detect_encoding($string));
}
public function substr($string, $start, $length = false) {
if(!$length)
$length = $this->strlen($string);
return mb_strlen($string, $start, $length, mb_detect_encoding($string));
}
// ...
}
然后你会使用(好的,我们将它命名为mbstring
):
$this->mbstring->strlen($the_string);
使用UTF-8类我们非常紧密地使用UTF-8编码,这是不必要的...我可能决定使用ISO-*
编码或Windows-1250
我真的很生气。使用UTF8类/助手这几乎是不可能的......你怎么看?
答案 1 :(得分:0)
从技术上讲,它并不重要。但与所有功能一样,它使事情变得更容易。而不是写strlen(utf8_decode())
更容易写utf8_strlen()
。另一个好处是,您不会想要“忘记”使用utf8_decode
函数,只需使用strlen()
。
所以它在技术上并不重要,但如果你知道你(几乎)总是要进行双重函数调用,为什么不为它创建一个帮助器呢?