OpenCart中的UTF8编码

时间:2013-05-16 06:28:14

标签: php utf-8 opencart

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

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

2 个答案:

答案 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()

所以它在技术上并不重要,但如果你知道你(几乎)总是要进行双重函数调用,为什么不为它创建一个帮助器呢?