1

OpenCart Daniel には、さまざまな UTF8 関数を備えた UTF8 ヘルパー ファイルが含まれています。

これが私の質問です...

OpenCart で utf8 ヘルパー関数を使用する場合と、ネイティブ php 関数で 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;
    }
}

これには、以前ローダー クラスにあった配列テスト関数も含まれます。

4

2 に答える 2

2

Hugo が指摘したように、これらのヘルパー関数は 2 ~ 3 つの異なる関数を呼び出すための単なるラッパーです。これらの関数は、エンコードされたテキストのstrpos 再実装全体のように見えることがあります...UTF-8

正直に言うと、私はそれらの実装やヘルパー内の他のutf8_strtolower機能が好きではありません(私は吐きそうだと思います)。また、独自のモジュールやその他の変更を実装するときはいつでも、関数を使用しています。utf8_strtoupperutf8_*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);

ISO-*UTF-8 クラスでは、必要のない UTF-8 エンコーディングを使用するようにかなり縛られています...エンコーディングを使用したいと決めるかもしれませWindows-1250ん。UTF8 クラス/ヘルパーでは、これはほとんど不可能です...どう思いますか?

于 2013-05-16T08:25:02.617 に答える