1

在 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_strtolowerutf8_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;
    }
}

这还包括我之前在加载器类中拥有的数组测试功能。

4

2 回答 2

2

正如 Hugo 所指出的,这些辅助函数只是调用两三个不同函数的包装器。有时这些函数看起来直接像编码文本的整体strpos 重新实现......UTF-8

老实说,我不喜欢那些utf8_strtolower/utf8_strtoupper实现,也不喜欢utf8_*helper 中的其他功能(我想我要吐了)。每当我实现自己的模块或其他修改时,我都在使用mbstring函数:

mb_strtolower($string, 'UTF-8');
mb_strlen($string, 'UTF-8');

它们与基本字符串函数相同,但带有附加(可选)编码参数。有很多多字节操作,查看文档。这些可以与任何编码一起使用,即使您不知道编码,您也可以这样使用它们:

// 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');

这些功能的唯一要求是启用 PHPmbstring扩展。

由于评论而编辑:所以您也在使用新方法,因此也打破了一致性:-) 除非这个新类将参与新版本的 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 类/助手,这几乎是不可能的……你觉得呢?

于 2013-05-16T08:25:02.617 回答
0

从技术上讲,这并不重要。但与所有功能一样,它使事情变得更容易。而不是写strlen(utf8_decode())它更容易写utf8_strlen()。另一个好处是您不会想“忘记”使用该utf8_decode功能而只需使用strlen().

因此,从技术上讲,您使用什么并不重要,但是如果您知道(几乎)总是必须进行双重函数调用,为什么不为它创建一个助手呢?

于 2013-05-16T07:01:00.433 回答